KeepAlive的缓存策略

86 阅读1分钟

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

  1. KeepAlive使用一个数组keys来保存所有的key
  2. 进入一个页面,执行页面对应组件的render函数,判断当前页面是否已经缓存,如果有缓存,则先将当前key从keys中移除,再将当前key添加到keys的最后

KeepAlive缓存的是什么

KeepAlive缓存的是Vnode.componentInstance

KeepAlive如何清除缓存

  1. 通过动态修改include属性
  2. 通过$ref直接修改keepAlive组件中的cache和keys

Vue2的KeepAlive如何清除缓存

在Vue2中RouterView没有插槽,无法对组件的名字进行二次封装。

Vue2实现多页面/多路由共用组件的解决方案是:

  1. KeepAlive子节点设置key为route.path;
  2. KeepAlive组件设置include为组件的name,此时inclue包含的name和route.path是一对多的关系,所以不能通过修改include的方式清除缓存;
  3. 此时,我们可以通过监听route,遍历内页签,将不包含在内页签中,但在cache中存储的缓存清除,清除方式是通过this.$refs直接修改KeepAlive组件内部的cache和keys。

关闭内页签的一种方式

直接通过document.getElementByClassNames找到关闭节点,直接写ele.click()的方式关闭。