前言
最近蒸煮在做一个独立项目的时候遇到了一个小坑,特此做个爬坑纪念。
基本情景是页面之间通过vue路由跳转,从页面A跳转到页面B(在页面B进行对应操作后),再从页面B跳转到页面C。之后再从页面C返回到页面B,页面B保留之前状态,返回页面A,页面B状态不保留。(。・∀・)ノ゙嗨~感觉说的好乱。
总之就是,前进刷新,后退不刷新(刷新是指是否重新渲染)
相信很多小伙伴都会想到用keep-alive开启缓存页面来实现,鹅,蒸煮也没例外,下面就是蒸煮的爬坑过程。
vue路由开启keep-alive缓存页面
keep-alive是vue官方提供的一种缓存组件实例的方法。
第一步,先改写<router-view>的展示方式
<keep-alive>
//这是会被缓存的页面
<router-view v-if="$route.meta.keepAlive">
</router-view></keep-alive>
<router-view v-if = "!$route.meta.keepAlive">
//这里是不被缓存的组件
</router-view>
第二步,在路由配置文件里,配置组件是否被缓存
routes:[
{ path: '/',
name: 'Index',
component: Index,
meta:{
title:"博物馆",
keepAlive:false//不缓存
}
},
{
path:'/searchMain',
name:'SearchMain',
component:SearchMain,
meta:{
title:"搜索",
keepAlive:true,//缓存
}
},
{
path:'/collectionDetails',
name:'CollectionDetails',
component:CollectionDetails,
meta:{
title:"藏品详情",
keepAlive:false,//不缓存
}
}]
这样的话无论什么时候,缓存的组件一直会被缓存
第三步,根据路由钩子来改变缓存组件的状态
beforeRouteLeave(to, from, next) {
if(to.path="首页"){
from.meta.keepAlive =false;
}else if(to.path="详情页"){
from.meta.keepAlive = true;
} // 跳转到 首页时,不缓存,跳转到详情页时缓存(就是不刷新)
next();
}
这种行吗?行吗?行吗?不行!!因为第一次的时候确实会成功,可是退出去以后就gg了,
因为keepAlive已经变成了false,第二次就不会缓存。那么第一个页面加下面代码,让他进入的时候
beforeRouteLeave(to, from, next) {
if(to.path=="/searchMain"){
to.meta.keepAlive =true;
}
next(true);
return;
},
实践证明,搜索界面的数据一直是第一次缓存过的数据。
二,为了解决这个问题,蒸煮想起了keep-alive组件相关的两个钩子函数。
activated:缓存的组件再次进入时触发;
deactivated:缓存的组件离开时会触发;
第一次进入keep-alive组件时,其生命周期执行顺序:
beforeRouteEnter ->created ->mounted ...->activated ->deactivated
非首次进入时,其生命周期执行顺序
beforeRouteEnter ->activated ->deactivated
第二次进入的时候vue组件的生命周期函数都没有执行,说明缓存组件也无法销毁。更无法更新。
解决方法
activated() {
if(!this.$route.meta.isBack) {
// 如果isBack是false,表明需要获取新数据,否则就不再请求,直接使用缓存的数据 this.getData(); // ajax获取数据方法
}
// 恢复成默认的false,避免isBack一直是true,导致下次无法获取数据
this.$route.meta.isBack = false
},
但素,重新换取数据,之前保存在data里的数据并没有变,感觉还是不太彻底!
终极解决方案
最后终于到答案的最后一步啦那
就是动态给要缓存的路由组件添加key值啦~
<keep-alive>
<router-view v-if="$route.meta.keepAlive" :key='key'></router-view>
</keep-alive>
<router-view v-if="!$route.meta.keepAlive" :key='key'></router-view>
在vuex中有条件改变key的值
beforeRouteLeave(to,from,next){
if(to.path=="/"){
this.$store.commit("UPDATE_KEY",this.$route.name!==undefined?this.$route.name+
+new Date():this.$route+ +new Date());
}
}
这样的话就会有一个很重要的问题,这些缓存过的组件,都是在内存中的,如果一直操作,内存堆积越来越大,导致系统卡顿。所以离开时就销毁吧
手动触发销毁
beforeRouteLeave(to,from,next){
if(to.path=="/"){
this.$store.commit("UPDATE_KEY",this.$route.name!==undefined?this.$route.name+ +new Date():this.$route+ +new Date());
this.$destroy();//销毁吧
}
结语:写完了,希望能够供大家参考哦!
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对亿速云的支持。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。