随手记之Vue2版本keep-alive只对其直属的router-view生效

210 阅读2分钟

背景

最近为旧项目增加页面缓存的效果,正常是为最顶层的router-view使用keep-alive进行包裹,然后将vue-router的所有路由配置过滤一遍,拿到所有配置缓存项为true的组件name,作为数组配置到include里面。

但是我尝试了很多次,即使我把include的值给写死,keep-alive依旧不生效。

但是也不是全部生效,有的还是生效的,比如驾驶舱、工作台....

我发现我项目的路由层级是这样的

image.png

我解释一下,每个节点都是一个页面,下属的节点是页面其中的router-view渲染出来的组件,也就是说,一共有三层router-view.

好了,现在看来keep-alive放在最顶层,肯定不生效了。

由于历史原因,我现在的需求是缓存page1和page2。

如果我再workplat外包裹一层keep-alive,并且include=['page1']的话,那么page2和page3就存不上了。

这里我在解释一下,如果父组件缓存了,那么子组件也会被缓存。如果父组件被销毁重建了,那么其内部的keep-alive也会被销毁重建,需要缓存的子组件也直接没了,不会被缓存。

也就是说我从在workplat和page2之间切换的时候,即使我设置了缓存page1和page3,那么在workplat被销毁的时候,缓存也是直接不生效了。

解决办法:

1、铺平,只留一个router-view

我的旧项目和开发时间不允许我这么做

2、缓存的组件放到一个keep-alive下

也就是把page2也放在workplat下面【落实了】,我改成这样了

image.png

3、看看vue3是不是支持跨层级keep-alive,或者插件