vue3缓存页面keep-alive及路由统一处理详解
作者:敲代码的张杰 发布时间:2024-05-02 16:34:12
目录
一、前言
二、使用
1.vue2和vue3的不同
2.页面某些数据不需要缓存
3.动态设置keepAlive属性
4.使用include,exclude配置需要缓存的组件
5.部分页面过来需要缓存,部分页面过来需要刷新
6.缓存只在一级路由生效
总结
一、前言
当使用路由跳转到其他页面的时候,要求缓存当前页面,比如列表页面跳转到详情页面,需要缓存列表内容,并且保存滚动条位置,也有时候需要缓存的页面里面有部分内容不缓存,总之各种情况,下面就列举其中一些例子
vue2和vue3的使用方式是不一样的
created()方法和mounted()方法在页面初始化的时候会执行,如果缓存了页面,这两个方法都不会再执行,还有如果缓存了页面,vue2中的destroyed()和vue3中的unmounted()方法都不会执行
activated()方法在每次进入页面都会执行
二、使用
1.vue2和vue3的不同
vue2:
<template>
<div id="nav">
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link>
</div>
<!-- vue2.x配置 -->
<keep-alive>
<router-view v-if="$route.meta.keepAlive" />
</keep-alive>
<router-view v-if="!$route.meta.keepAlive"/>
</template>
vue3:
<template>
<div id="nav">
<router-link to="/">Home</router-link> |
<router-link to="/about">About</router-link>
</div>
<!-- vue3.0配置 Component是固定写法-->
<router-view v-slot="{ Component }">
<keep-alive>
<component :is="Component" v-if="$route.meta.keepAlive"/>
</keep-alive>
<component :is="Component" v-if="!$route.meta.keepAlive"/>
</router-view>
</template>
route.js中配置:
path: '/',
name: 'Home',
component: Home,
meta:{
keepAlive: true
}
效果:
2.页面某些数据不需要缓存
可以在activated()方法中处理需要部分刷新的逻辑
...
需要部分刷新的数据:<input type="text" v-model="newStr" />
...
data() {
return {
newStr: "2",
};
},
mounted() {
console.log("执行了mounted方法");
this.newStr = "3";
},
activated() {
console.log("执行了actived方法。。。");
this.newStr = "4";
}
效果:
3.动态设置keepAlive属性
也可以在vue文件中设置keepAlive属性,实测只有在beforeRouteEnter()方法中添加才会生效,即进入页面的时候
在Home.vue中添加:
// 使用组件内守卫,对离开页面事件做一些操作
// to为即将跳转的路由,from为上一个页面路由
beforeRouteEnter(to, from, next) {
to.meta.keepAlive = true;
// 路由继续跳转
next();
}
4.使用include,exclude配置需要缓存的组件
在app.vue中配置:
<router-view v-slot="{ Component }">
<keep-alive include="testKA">
<component :is="Component"/>
</keep-alive>
</router-view>
其中,testKA对应某个组件的name:
export default {
name:'testKA',// keep-alive中include属性匹配组件name
data() {return {}},
activated() {
// keepalive缓存的页面每次进入都会进行的生命周期
},
}
此外,include用法还有如下:
<!-- 逗号分隔字符串 -->
<keep-alive include="a,b">
<component :is="view"></component>
</keep-alive>
<!-- 正则表达式 (使用 `v-bind`) -->
<keep-alive :include="/a|b/">
<component :is="view"></component>
</keep-alive>
<!-- 数组 (使用 `v-bind`) -->
<keep-alive :include="['a', 'b']">
<component :is="view"></component>
</keep-alive>
exclude用法与include用法相同,代表不被缓存的组件。
5.部分页面过来需要缓存,部分页面过来需要刷新
描述:如有a,b,c三个页面,a->b时,b刷新页面,然后b->c,c->b时,b不刷新页面,再b->a,a->b时,b刷新页面。
自测,只有配合vuex才能实现,但是缺点是,页面缓存的时候不执行activated()方法
6.缓存只在一级路由生效
如果需要在二级路由使用缓存,可以在一级路由中进行同样的配置
store.js代码:
state: {
keepAlives:[]
},
mutations: {
SET_KEEP_ALIVE(state,params) {
state.keepAlives = params
}
},
getters:{
keepAlive:function(state){
return state.keepAlives
}
}
App.vue代码:
<template>
<div id="nav">
<router-link to="/bbb">BBB</router-link> |
<router-link to="/home">Home</router-link> |
<router-link to="/about">About</router-link>
</div>
<router-view v-slot="{ Component }">
<keep-alive :include="keepAlive">
<component :is="Component"/>
</keep-alive>
</router-view>
</template>
<script>
export default{
computed:{
keepAlive(){
return this.$store.getters.keepAlive
}
}
}
</script>
Home.vue代码:
// 使用组件内守卫,对离开页面事件做一些操作
// to为即将跳转的路由,from为上一个页面路由
beforeRouteEnter(to, from, next) {
next(vm=>{
if(from.path == "/bbb"){
vm.$store.commit("SET_KEEP_ALIVE",["Home"])
}
});
},
beforeRouteLeave(to, from, next) {
if (to.path == "/about") {
console.log("将要跳转/about页面...")
} else {
console.log("将要跳转非/about页面...")
this.$store.commit("SET_KEEP_ALIVE",[])
}
// 路由继续跳转
next();
}
效果:
来源:https://blog.csdn.net/m0_37840862/article/details/120764072


猜你喜欢
- argparse 模块是Python内置的用于命令项选项与参数解析的模块,可以轻松编写友好的命令行接口,能够帮助程序员为模型定义参数。传入一
- 在实际的机器学习项目中,我们通常需要将训练好的模型保存到磁盘,以便在以后的时间点进行推理或重新训练。同样地,我们也需要从磁盘加载模型以供使用
- 前言:关于数据库范式,时常有听说过,一直没有详细去了解。一般数据库书籍或数据库课程会介绍范式相关内容,范式也经常出现在数据库考试题目中。不清
- 本文实例为大家分享了python实现手写数字识别的具体代码,供大家参考,具体内容如下import numpyimport scipy.spe
- open 遍历一个大日志文件使用 readlines() 还是 readline() ?总体上 readlines() 不慢于python
- Django中的静态文件夹static在创建好Django项目时默认是没有的,需要我们手动自己去创建,static文件夹里主要存放一些能暴露
- 本文实例为大家分享了js实现简单放大镜特效的具体代码,供大家参考,具体内容如下先来看看效果:写放大镜之前我们先来了解一下定位:通常子绝父相
- Tensorflow可以使用训练好的模型对新的数据进行测试,有两种方法:第一种方法是调用模型和训练在同一个py文件中,中情况比较简单;第二种
- 文末附完整源代码实现过程...想实现这样一个功能,然后pyqt5中又没有现成的组件可以使用,于是就想着只能通过绘图的方式来实现。说到绘图的话
- 需求场景,五百个文件里面,选取50个指定文件,放入新的文件夹里。1、准备工作1 安装python环境可能会报错,并且pip install
- 如何用ASP发送带附件的邮件?请问如何用CDONTS组件发送带附件的邮件? 见下列代码:<%&nb
- 本程序将使用字典来构建有向无环图,然后遍历图将其转换为对应的Excel文件最终结果如下:代码:(py3) [root@7-o-1 py-da
- SQL Server 2008已经发布,我们可以看到它在各方面都有了显著的进步,这些让人侧目之处和失望之处都有可能极大地影响大型企业的采购意
- 今天遇到下图这种问题,文字过长,显示不全。折腾了老半天,在网上搜了半天也找不到解决方案。于是问了下同事,同事提到了<optgroup&
- SQL Server数据库查询优化的常用方法总结:本文中,abigale代表查询字符串,ada代表数据表名,alice代表字段名。技巧一:问
- 概述Go 语言中的 new 和 make 一直是新手比较容易混淆的东西,咋一看很相似。不过解释两者之间的不同也非常容易。new 的主要特性首
- 直接使用word文档已经难不倒大家了,有没有想过用python构建一个word文档写点文章呢?当然这个文章的框架需要我们用代码一点点的建立,
- 数据库和操作系统一样,是一个多用户使用的共享资源。当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操
- 1.文件打开与关闭在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件open(文件名,访问模式)。 f = o
- 扪心自问,你真正了解你卖给用户的是什么玩意么?你所认为革命性的,一定会震惊世界的功能、特色,用户真的买单么?我的意思是,我们总是习惯性的忘记