KeepAlive的缓存策略
keepAlive组件定义一个cache对象,用来存储缓存的页面。keepAlive设置缓存key的源码如下:
判断vnode的上是否有key属性,即<router-view />上的key属性,没有就以组件的 cid 作为 key。
所以默认情况下, 一个组件只会缓存一份,当多个页面共用同一组件的时候,页面上的数据会相互影响, 所以这种情况下一定要设置<router-view />上的key属性。
vnode取的是<keep-alive />下的第一个儿子
var key = vnode.key === null
? componentOptions.Ctor.cid + (componentOptions.tag ? ("::" + (componentOptions.tag)) : '')
: vnode.key
KeepAlive是如何保鲜的
在KeepAlive可以设置最大缓存数量max
- KeepAlive使用一个数组keys来保存所有的key
- 进入一个页面,执行页面对应组件的render函数,判断当前页面是否已经缓存,如果有缓存,则先将当前key从keys中移除,再将当前key添加到keys的最后
KeepAlive缓存的是什么
KeepAlive缓存的是Vnode.componentInstance
KeepAlive如何清除缓存
- 通过动态修改include属性
- 通过$ref直接修改keepAlive组件中的cache和keys
Vue2的KeepAlive如何清除缓存
在Vue2中RouterView没有插槽,无法对组件的名字进行二次封装。
Vue2实现多页面/多路由共用组件的解决方案是:
- KeepAlive子节点设置key为route.path;
- KeepAlive组件设置include为组件的name,此时inclue包含的name和route.path是一对多的关系,所以不能通过修改include的方式清除缓存;
- 此时,我们可以通过监听route,遍历内页签,将不包含在内页签中,但在cache中存储的缓存清除,清除方式是通过this.$refs直接修改KeepAlive组件内部的cache和keys。
关闭内页签的一种方式
直接通过document.getElementByClassNames找到关闭节点,直接写ele.click()的方式关闭。