问题描述
使用arco-design-pro的vue3后台框架, 切换路由时, 组件包裹的keepAlive不生效, 切换tab后组件状态会刷新, 并重新获取接口, 导致页面切换时闪烁
尝试了网上说的很多方法, 例如添加name、路由层级等等依旧无法解决, 之后开始剥洋葱, 删减代码, 做最小复现后, 得出解决方案
解决方法
⚠️请注意: 解决方案可能并不全面, 可以参考网上许多基础的帖子, 我总结了在实际项目中出现并且容易忽略的位置,可能带有一些主观性,但希望能提供一些灵感。
-
router路由中需要添加name, 和组件中需要保持一致即可
-
如果需要keepAlive的页面是孙路由, 子路由组件的router-view也应该包裹keepAlive.
- vue3中会根据组件名自动生成name, 但有时我们的组件或者文件名并不是name, 导致自动生成的和路由的name对应不上, 这时需要手动命名组件,
查阅官网后发现, 需要使用defineOptions进行手动命名, 值得注意的是, 要使用defineOptions, 而不是defineComponent
- arco的组件库在顶层的layout中添加了cacheList, 导致keepAlive不生效
思路总结
keepAlive的不生效可能是多种多样的, 但排查思路大同小异, 希望对正在被keepAlive折磨的友友有帮助~
- 检查router和组件中的name是否对应
- 从需要缓存的组件往外剥洋葱, 确认每层的keepAlive使用无误
- 删减不需要的代码, 尽可能实现最小复现
- 不同版本之间存在实现差异, 可以多看vue官方文档, 说不定会豁然开朗