解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况
作者:风伤影
需求:
项目中需要开发一个导航栏,类似浏览器的导航,没有关闭的时候页面缓存,关掉之后,页面随之销毁。(如图)
项目是使用Vue + Vue-Router + Vuex
刚开始使用的方法是:关闭导航标签,直接调用对应的页面的$destory()方法,OK,可以实现关闭页面(下次再打开该页面,将初始化)的功能,但是遇到个问题:
该页面将不再被缓存,也就是说切换导航tab时,页面将不断的被初始化!!!
查了一下文档,找了度娘,没发现解决方法,又去请教G哥,这才发现原来Vue keep-alive真的有这个问题哎,这个是(链接),要么你自己去看,要么看我的解决方法,嘿嘿嘿,不瞎扯啦,上方法,其实Vue的文档里面也写了的这里:
keep-alive 可以传入两种参数,贴一下官方说明:
include 和 exclude 属性允许组件有条件地缓存。二者都可以用逗号分隔字符串、正则表达式或一个数组来表示:
< keep-alive include=”a,b”> < component :is=”view”> < /keep-alive> < !– 正则表达式 (使用 v-bind) –> < keep-alive :include=”/a|b/”> < component :is=”view”> < / keep-alive> < !– 数组 (使用 v-bind) –> < keep-alive :include=”[‘a', ‘b']”> < component :is=”view”> < /keep-alive>`
匹配首先检查组件自身的 name 选项,如果 name 选项不可用,则匹配它的局部注册名称 (父组件 components 选项的>>键值)。匿名组件不能被匹配。
keep-alive 不会在函数式组件中正常工作,因为它们没有缓存实例。
差不多看明白了吧,页面的销毁不一定非得调用$destory() 去做,我理一下思路(include):
首先在vuex里面定义一个数组 includePageNames,这个数组存放的是当前导航栏上显示的页面的名字name(在每个页面的Vue文件中,定义name的值)
当页面打开的时候,将该页面的name加($commit)到includePageNames中
当页面关闭的时候,将includePageNames中该页面对应的name移除掉,这时候该页面液将从缓存中被移除,这不就达到我们想要的结果了吗
具体代码我就不上了,就提一下我遇到的问题:keep-alive 给它传入includePageNames(数组),居然报错,原因是它实际上需要一个正则表达式、或者一个逗号分隔的String,没办法啦,直接将includePageNames.toString()传过去就OK啦
补充知识:vue 页面保留缓存和清除缓存
路由:
routes: [{ path: '/page1', name: page1', component: page1', meta:{ keepAlive:true //true是保存缓存,false是不保存 } },{ path: '/page2', name: page2', component: page2', meta:{ keepAlive:true } }]
页面js:
/** * 判断是否要清除缓存,beforeRouteLeave与methods等平级 */ beforeRouteLeave(to, from, next) { //参数(马上去的页面,现在的页面,跳转) if(判断条件){ to.meta.keepAlive = false //将要去的那个页面的缓存清空 }else{ to.meta.keepAlive = true //将要去的那个页面的缓存保留 } next(); },
以上这篇解决Vue keep-alive 调用 $destory() 页面不再被缓存的情况就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。