KeepAlive与RouterView缓存

参考

vue动态组件<Component>与<KeepAlive>

KeepAlive官网介绍

缓存之keep-alive的理解和应用

Vue3+Vite KeepAlive页面缓存问题

vue多级菜单(路由)导致缓存(keep-alive)失效

vue3 router-view keeperalive对于同一路径但路径参数不同

  • Vue keep-alive,同一个路由组件参数不同,如何分别缓存状态

  • Vue路由 – 相同路由路径参数不同,复用组件问题

文章目录

  • 参考
  • 效果
    • main.js
      • router.js
    • App.vue
      • Home.vue
      • Chat.vue
        • ChatDetail.vue

效果

在这里插入图片描述

main.js

import { createApp } from 'vue'

import './style.css'

import App from './App.vue'
import router from './router'

import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

const app = createApp(App)
app.use(router)
app.use(ElementPlus)
app.mount('#app')

router.js

import { createWebHistory, createRouter } from "vue-router"

import Home from '@/views/Home.vue'
import Chat from '@/views/Chat.vue'
import ChatDetail from '@/views/ChatDetail.vue'

const routes = [
    {
        path: '/',
        redirect: '/home'
    },
    {
        path: '/home',
        name: 'home',
        component: Home
    },
    {
        path: '/chat',
        name: 'chat',
        component: Chat,
        children: [
            {
                path: 'detail/:id',
                name: 'chatDetail',
                component: ChatDetail
            },
        ]
    },
]
const router = createRouter({
    history: createWebHistory(),
    routes,
})

export default router

App.vue

<template>
  <div style="height: 100%;">

    <div class="header">
      <el-button @click="nav('/home')">/home</el-button>
      <el-button @click="nav('/chat')">/chat</el-button>
      <el-button @click="nav('/chat/detail/1')">/chat/detail/1</el-button>
      <el-button @click="nav('/chat/detail/2')">/chat/detail/2</el-button>

      <div style="height:100%;width:1px;background-color:#eee;margin: 10px;"></div>

      <!-- 这里的缓存的意思是: 当从ChatDetail组件切到Home组件时, Chat组件实例里的数据还是否缓存 -->
      <el-button @click="cachedComponents = ['Chat']">缓存chat</el-button>
      <el-button @click="cachedComponents = []">取消缓存chat</el-button>{{cachedComponents}}
    </div>

    <!-- 当在home组件与chat组件切换时, 被切走的组件会被销毁, 切过去的组件会被创建 -->
    <!-- <router-view class="container-wrapper"/> -->

    <!-- home组件和chat组件都仅仅被创建了1次, 当在home组件与chat组件切换时, home组件与chat组件并未被销毁或创建 -->
    <!-- <router-view v-slot="{ Component }">
        <keep-alive>
          <component :is="Component" class="container-wrapper"/>
        </keep-alive>
    </router-view> -->

    <!-- home组件仅被创建了1次并且切走时会被缓存下来不会被销毁, 切过来时不会重新创建; 
         而chat组件被切走会被销毁, 切到chat组件时, chat组件会被创建;
         这里的include指的是 组件名称, 而不是路由名称 -->
    <!-- <router-view v-slot="{ Component }">
        <keep-alive :include="['Home']">
          <component :is="Component" class="container-wrapper"/>
        </keep-alive>
    </router-view> -->

    <router-view v-slot="{ Component }">
        <keep-alive :include="cachedComponents">
          <component :is="Component" class="container-wrapper"/>
        </keep-alive>
    </router-view>

  </div>
</template>

<script setup>
  import {ref} from 'vue'
  import { useRouter, useRoute } from 'vue-router';

  const router = useRouter();
  const route = useRoute();

  const cachedComponents = ref([])

  function nav(path) {
      // console.log(path);
      router.push(path);
  }
</script>

<style>
body,html {
  margin:0;
  padding: 0;
  height: 100%;
}
#app {
  height: 100%;
  & .header {
    height: 51px;
    line-height: 51px;
    padding: 0 20px;
    border-bottom: 1px solid #eee;
    display: flex;
    align-items: center;
    justify-content: flex-start;
  }
  & .container-wrapper {
    height: calc(100% - 52px);
  }
}
</style>

Home.vue

<template>
    <div class="home">
        <div>
            <h1>home</h1>
        </div>
    </div>
</template>

<script setup>
import {ref, onActivated, onDeactivated ,onUnmounted} from 'vue'

    import {useRouter} from 'vue-router';
    // 获取路由器
    const router = useRouter()
    
    console.log('【Home组件】创建');
    
    onUnmounted(()=>{
        console.log('【Home组件】销毁');
    })

</script>

<style lang="scss">
.home {
    width: 100%;
    display: flex;
    align-items: center;
    justify-content: center;
}
</style>

Chat.vue

<template>
    <div class="container">
        <div class="left">
            <el-button @click="nav('/home')">/home</el-button>
            <el-button @click="nav('/chat/detail/1')">/chat/1</el-button>
            <el-button @click="nav('/chat/detail/2')">/chat/2</el-button>
        </div>
        <div class="right">

            <!-- <router-view/> -->

            <!-- <router-view v-slot="{ Component }">
                <keep-alive>
                    <component :is="Component"/>
                </keep-alive>
            </router-view> -->

            <!-- 这里给component添加1个key之后, 就可以根据路由路径来缓存组件实例了: 1个路由路径对应1个组件实例 -->
            <router-view v-slot="{ Component }">
                <keep-alive>
                    <component :is="Component" :key="route.path"/>
                </keep-alive>
            </router-view>
        </div>
    </div>
</template>

<script setup>
    import { onUnmounted } from 'vue'
    import { useRouter,useRoute } from 'vue-router'
    const route = useRoute()
    const router = useRouter();
    function nav(path) {
        // console.log(path);
        router.push(path);
    }

    console.log('【Chat组件】创建');
    
    onUnmounted(()=>{
        console.log('【Chat组件】销毁');
    })
</script>

<style lang="scss" scoped>
.container {
    display: flex;
    .left {
        width: 220px;
        border-right: 1px solid #eee;
        display: flex;
        flex-direction: column;
        align-items: center;
        padding-top: 10px;
        background-color: #f2f2f2;
        .el-button {
            margin-bottom: 10px;
            width: 80%;
        }
    }
    .right {
        flex: 1;
        padding: 20px;
        background-color: #e1e1e1;
    }   
}
.el-button+.el-button {
    margin-left: 0;
}
</style>
ChatDetail.vue
<template>
    <div class="chat-box">
        <div class="header">
            <h1>会话{{route.params.id}}</h1>
        </div>
        <div class="msg-list">
            <el-input v-model="content" placeholder="请输入"></el-input>
        </div>
    </div>
</template>

<script setup>
import {ref, onActivated, onDeactivated ,onUnmounted} from 'vue'
import {useRoute} from 'vue-router';
const content = ref();
const route = useRoute();

onActivated(()=>{
    console.log('---【ChatDetail组件】激活---');
});
onDeactivated(()=>{
    console.log('---【ChatDetail组件】取消激活---');
});

console.log('---【ChatDetail组件】创建---');

onUnmounted(()=>{
    console.log('---【ChatDetail组件】销毁---');
})

</script>

<style lang="scss" scoped>
    .chat-box {
        display: flex;
        flex-direction: column;
        height: 100%;
        .msg-list {
            flex: 1;
        }
    }
    .header {
        border: 2px solid #eee;
        line-height: 68px;
        height: 68px;
        h1 {
            margin: 0;
        }
    }
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/937019.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

类与对象以及ES6的继承

认识class定义类 类的声明用的比较多 类与构造函数的异同 类的构造函数 类的实例方法 类的访问器方法 在类里面写拦截方法 类的静态方法 通过类名直接访问 es6类的继承-extends super关键字 子类可以重写父类方法包括父类的静态方法也可以继承父类的静态方法 babel可以将新的代…

AI监控赋能健身馆与游泳馆全方位守护,提升安全效率

一、AI视频监控技术的崛起 随着人工智能技术的不断发展&#xff0c;AI视频监控正成为各行业保障安全、提升效率的关键工具。相比传统监控系统&#xff0c;AI技术赋予监控系统实时分析、智能识别和精准预警的能力&#xff0c;让“被动监视”转变为“主动防控”。 二、AI监控应用…

嵌入式学习(18)-stm32F407串口接收空闲中断+DMA

一、概述 在一些一次性接收大批量数据的引用场合&#xff0c;如果使用接收中断会频繁的进入接收中断影响代码的运行效率。为了解决这个问题可以使用串口的空闲中断DMA实现。 二、应用 在网上招了一些例程在STM32F407的平台上都没有跑通会出现各种异常&#xff0c;主要原因还…

2024.12.15CISCN长城杯铁人三项赛

WEB Safe_Proxy 刚开始比赛看到题目名字里面有Proxy 就先来做这个了(在最近的比赛中见到的proxy题比较多) 题目进入之后给了源码 源码 from flask import Flask, request, render_template_string import socket import threading import htmlapp Flask(__name__)app.rout…

【Linux服务器nginx前端部署详解】ubantu22.04,前端Vue项目dist打包

本文主要讲一下在Linux系统环境下&#xff08;以ubantu22.04为例&#xff09;&#xff0c;如何用nginx部署前端Vue项目打包的dist静态资源。有些具体的命令就不展开讲了&#xff0c;可以自行查看其他博主的文章&#xff0c;我主要讲整体的步骤和思路。 一、ubantu系统安装ngin…

SAP软件如何启用反记账功能

SAP软件和国内ERP软件不一样&#xff0c;它在录入会计凭证时是不可以录入负数的&#xff08;即红冲凭证&#xff09;&#xff0c;因此无法直接实现传统意义上的红字冲销。 比如&#xff0c;如下SAP正常和冲销业务产生会计凭证如下&#xff1a; 正常的业务凭证&#xff1a; 借…

iOS swift开发系列 -- tabbar问题总结

1.单视图如何改为tabbar&#xff0c;以便显示2个标签页 右上角➕&#xff0c;输入tabbar 找到控件&#xff0c;然后选中&#xff0c;把entrypoint移动到tabbar控件 2.改成tabbar&#xff0c;生成两个item&#xff0c;配置各自视图后&#xff0c;启动发现报错 Thread 1: “-[p…

Level DB --- coding

Util coding是Level DB中重要的数据结构&#xff0c;它主要用来将uint32&#xff0c;和uint64高效的序列化到字符串中和从字符串中反序列化出来。 coding两种序列化形式 Util coding中主要提供两种序列化形式&#xff0c;即Fixed形式和Var形式。其中Fixed形式是常规形式&…

EfficientNet与复合缩放理论(Compound Scaling Theory) 详解(MATLAB)

1.EfficientNet网络与模型复合缩放 1.1 EfficientNet网络简介 1.1.1 提出背景、动机与过程 EfficientNet是一种高效的卷积神经网络&#xff08;CNN&#xff09;&#xff0c;由Google的研究团队Tan等人在2019年提出。EfficientNet的设计目标是提高网络的性能&#xff0c;同时减…

CentOS7 Apache安装踩坑

Gnome桌面右键弹出终端。 [rootlocalhost ~]# yum repolist 已加载插件&#xff1a;fastestmirror, langpacks /var/run/yum.pid 已被锁定&#xff0c;PID 为 2611 的另一个程序正在运行。 Another app is currently holding the yum lock; waiting for it to exit... [root…

接收文件并保存在本地

接受多个文件 前端 <input typefile namefilelist> <input typefile namefilelist> <input typefile namefilelist> ... 后端 filelist request.files.getlist(name属性值) 获取文件内容 单个文件 file request.files.get(file)content file.read…

关于解决VScode中python解释器中的库Not Found的问题

关于解决VScode中python解释器中的库Not Found的问题 背景介绍解决步骤1. 检查当前使用的Python解释器2. 确保选择正确的Python解释器3. 安装库到指定的Python环境①使用 pip 完整路径指定&#xff1a;②使用 conda 安装&#xff1a;③使用 python -m pip 指定解释器&#xff1…

springboot436校园招聘系统(论文+源码)_kaic

摘 要 使用旧方法对校园招聘系统的信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在校园招聘系统的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。这次开发的校园招聘系…

YOLOv9改进,YOLOv9引入DLKA-Attention可变形大核注意力,WACV2024,二次创新RepNCSPELAN4结构

摘要 作者引入了一种称为可变形大核注意力 (D-LKA Attention) 的新方法来增强医学图像分割。这种方法使用大型卷积内核有效地捕获体积上下文,避免了过多的计算需求。D-LKA Attention 还受益于可变形卷积,以适应不同的数据模式。 理论介绍 大核卷积(Large Kernel Convolu…

LRM-典型 Transformer 在视觉领域的应用,单个图像生成3D图像

https://yiconghong.me/LRM. 一、Abstract 第一个大型重建模型&#xff08;LRM&#xff09;&#xff0c;它可以在5秒内从单个输入图像预测物体的3D模型。LRM采用了高度可扩展的基于transformer的架构&#xff0c;具有5亿个可学习参数&#xff0c;可以直接从输入图像中预测神经…

鸿蒙开发:一个轻盈的上拉下拉刷新组件

前言 老早之前开源了一个刷新组件&#xff0c;提供了很多常见的功能&#xff0c;也封装了List&#xff0c;Grid&#xff0c;WaterFlow&#xff0c;虽然功能多&#xff0c;但也冗余比较多&#xff0c;随着时间的前去&#xff0c;暴露的问题就慢慢增多&#xff0c;虽然我也提供了…

ByteCTF2024

wp参考&#xff1a; 2024 ByteCTF wp 2024 ByteCTF WP- Nepnep ByteCTF 2024 writeup by Arr3stY0u 五冠王&#xff01;ByteCTF 2024 初赛WriteUp By W&M ByteCTF 2024 By W&M - W&M Team ByteCTF Re WP - 吾爱破解 - 52pojie.cn 2024 ByteCTF - BediveRe_R…

Node.js教程入门第一课:环境安装

对于一个程序员来说&#xff0c;每学习一个新东西的时候&#xff0c;第一步基本上都是先进行环境的搭建&#xff01; 从本章节开始让我们开始探索Node.js的世界吧! 什么是Node.js? 那么什么是Node.js呢&#xff1f;简单的说Node.js 就是运行在服务端的 JavaScript JavaScript…

弧形导轨的变形因素有哪些?

随着弧形导轨的应用日渐普遍&#xff0c;在日常使用中总会遇到很多各种各样的问题&#xff0c;其中变形是最常见的问题&#xff0c;但通过采取正确的预防和解决措施&#xff0c;可以避免其对设备性能和精度造成的影响&#xff0c;以下是一些主要的变形原因&#xff1a; 1、负载…

SSL证书部署(linux-nginx)

一、SSL证书的作用 HTTP协议无法加密数据,数据传输可能产生泄露、篡改或钓鱼攻击等问题。 SSL证书部署到Web服务器后,可帮助Web服务器和网站间建立可信的HTTPS协议加密链接,为网站安全加锁,保证数据安全传输。 二、前提条件 1.已通过数字证书管理服务控制台签发证书。 …