最近维护一个以前的vue项目,遇到个keep-alive的坑,特此记下。
需求是需要使用keep-alive缓存,由于缓存的页面过多会导致页面卡顿,因此需要启用条件缓存。并且有三级路由存在,也需要缓存。然而在项目中发现,三级路由无法缓存。

原因查找

经查找原因为:
1、项目使用动态渲染路由即使用vue-router的addRouter方法,路由数据的name和vue组件的name选项数据不规范。而使用条件缓存时,需要用到router-link的includes属性。刚开始没注意到includes包含的name规定,其实vue官方文档讲的很明确,includes包含的是vue组件的name选项值,如果匹配不到当前组件的name选项,会去匹配当前组件的父级组件name选项。对于使用动态路由渲染的项目来说,includes包含的数据肯定从路由数据中来,因此,若路由数据的name和组件选项的name值不一致,缓存肯定会失败

在这里插入图片描述

2、项目中使用了动态路径路由(/path/:id),需要跟id路径参数做页面缓存,这时候router-link需要key属性,不然不生效。然而,使用了key属性,会造成keep-alive页面缓存失效

方案解决

清楚了原因,并且仔细阅读了keep-alive的官方api,那就好办了。
1、首先检查数据库返回的路由数据,检查name字段,确保有值并且值要规范(这里建议见名知意,并且和vue组件文件名称一致)
2、检查vue文件name选项,保持和路由数据的name字段一致
3、由于路由时动态渲染的,二级,三级路由都使用同一个容器文件渲染。当有三级路由需要缓存时,必须将路由容器组件加入includes中。这样三级路由缓存便可以生效

代码

代码就不上了,思路简单说下。
首先使用vuex存储router-link includes的值,这样方便更新。检查路由变化比如在全局路由前置守卫里面将路由数据的name添加到 includes 数据中。
其次。若有大量的三级路由,可手动直接将容器组件加到includes数据中,若比较少,可以判断是三级路由的时候判断数据里面有没有容器组件,没有则加入

结尾

最后想说的是,规范很重要。经常发现有些童鞋,文件名,组件名,路由名一团糟,不一致,甚至没有。

GitHub 加速计划 / vu / vue
207.54 K
33.66 K
下载
vuejs/vue: 是一个用于构建用户界面的 JavaScript 框架,具有简洁的语法和丰富的组件库,可以用于开发单页面应用程序和多页面应用程序。
最近提交(Master分支:2 个月前 )
73486cb5 * chore: fix link broken Signed-off-by: snoppy <michaleli@foxmail.com> * Update packages/template-compiler/README.md [skip ci] --------- Signed-off-by: snoppy <michaleli@foxmail.com> Co-authored-by: Eduardo San Martin Morote <posva@users.noreply.github.com> 4 个月前
e428d891 Updated Browser Compatibility reference. The previous currently returns HTTP 404. 5 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐