详解vue-template-admin三级路由无法缓存的解决方案


Posted in Javascript onMarch 10, 2020

1. 为什么三级会缓存不了

在src/layout/AppMain组件:

详解vue-template-admin三级路由无法缓存的解决方案

keep-alive的组件依赖cachedViews,cachedViews是store中的一个状态,cachedViews的逻辑在src/layout/TagView

详解vue-template-admin三级路由无法缓存的解决方案

当路由变更时就会调用addViewTags,addViewTag会根据匹配的路由name属性进行缓存。而用到三级路由的时候,拿到name只能时第三级路由的name,二级路由组件的名字会丢失,keep-alive就不会进行缓存。
知道原因之后,第一个想法就是把二级路由的name也加上去就好了。要实现这个也很简单,只需要获取到matched属性就可以拿到匹配到的路由组件,把它加入到cachedViews数组就好了。但是有个问题就是,假设这里有个二级路由1-1,三级路由1-1-1,1-1-2,当要关掉1-1-1组件时,你到底要不要把1-1给删了,如果删了,缓存能顺利失效,但是如果你之前是打开了1-1-2,缓存的路由就会失效,因为它是依赖1-1的。如果不删的话,在侧边栏打开1-1-1的链接的时候,它又会重新复用回原本的组件。

2 把三级(概念上的)转化为二级(真实)

在这里想来,如果1-1-1,1-1-2,其实只是因为分在同类别里,两者如果没有实际共享的数据,那可以考虑把1-1的路由组件关掉,在我实践的项目就是如此,1-1-1和1-1-2只是同属在二级菜单下,并没有共享数据。但是生成菜单的时候是用router表的,那么生成菜单的用原本的,生成路由的时候用替换的。

下面是demo代码:

将要被替换的路由加上noCompoent属性。

function delteFakeParent(router,prefix) {
 var newRouter = { ...router }
 if(prefix){
 newRouter.path = prefix + '/' + router.path
 }
 if (!router.children) return newRouter
 var children = []
 if (router.noCompoent) {
 for (let i = 0; i < router.children.length; i++) {
  const item = delteFakeParent(router.children[i], newRouter.path)
  if (Array.isArray(item)) {
  item.forEach(el => {
   children.push(el)
  })
  }else{
  children.push(item)
  }
 }
 newRouter = children
 } else {
 for (let i = 0; i < router.children.length; i++) {
  const item = delteFakeParent(router.children[i])
  if (Array.isArray(item)) {
  item.forEach(el => {
   children.push(el)
  })
  }
 }
 newRouter.children = children
 }
 
 return newRouter
}

var backendManageRouter1 = {
 name: 'BackendManage',
 meta: {
 title: '后台管理',
 icon: 'index-management'
 },
 children: [{
 path: 'user-manage',
 name: 'UserManage',
 noCompoent: true,
 meta: {
  title: '用户管理',
  icon: 'rule-definition'
 },
 alwaysShow: true,
 children: [{
  path: 'user',
  name: 'User',
  meta: {
  title: '用户管理',
  icon: 'quality-control'
  },
  noCompoent: true,
  children: [
  {
   path: 'a',
   name: 'ad',
   meta: {
   title: 'ad管理',
   icon: 'quality-control'
   },
  }
  ]
 }, {
  path: 'role',
  name: 'Role',
  meta: {
  title: '角色管理',
  icon: 'rule-task-monitor'
  }
 }]
 }]
}

delteFakeParent这个函数做的就是创建一个router副本,遍历它的children,当这个路由被标记为noCompoent: true,就把它替换成它的children,回溯的过程中如果router是一个数组就代表这个router是被替换过,那么就遍历它,把它每一项放到router.children里面,这样就可以做到跟它其他children平级。
修改了这个之后要记着把真实router和菜单router同时暴露出去,菜单的项目是读取store中的permission.js的routers,那么这里set-router一方面要处理真是router和菜单router,需要增加一个state

3. 使用vuex存储数据

上面那个方案也只是针对二级路由组件不需要显示出来,那么可以放到一级路由的children里面,但是如果是有需要的话,还是使用vuex来存储数据比较好。

到此这篇关于vue-template-admin三级路由无法缓存的解决方案的文章就介绍到这了,更多相关vue-template-admin三级路由缓存内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
改版了网上的一个js操作userdata
Apr 27 Javascript
js 实现图片预加载(js操作 Image对象属性complete ,事件onload 异步加载图片)
Mar 25 Javascript
js控制表单操作的常用代码小结
Aug 15 Javascript
使用Javascript简单实现图片无缝滚动
Dec 05 Javascript
jquery实现浮动的侧栏实例
Jun 25 Javascript
js实现向右横向滑出的二级菜单效果
Aug 27 Javascript
AngularJS中的包含详细介绍及实现示例
Jul 28 Javascript
浅谈jquery中next与siblings的区别
Oct 27 Javascript
微信小程序 视图容器组件的详解及实例代码
Jan 19 Javascript
Koa2微信公众号开发之消息管理
May 16 Javascript
vue 中Virtual Dom被创建的方法
Apr 15 Javascript
js中arguments对象的深入理解
May 14 Javascript
JS Html转义和反转义(html编码和解码)的实现与使用方法总结
Mar 10 #Javascript
js模拟实现烟花特效
Mar 10 #Javascript
JS实现放烟花效果
Mar 10 #Javascript
JS实现烟花爆炸效果
Mar 10 #Javascript
JS Web Flex弹性盒子模型代码实例
Mar 10 #Javascript
JS实现网页烟花动画效果
Mar 10 #Javascript
keep-alive不能缓存多层级路由菜单问题解决
Mar 10 #Javascript
You might like
解析php框架codeigniter中如何使用框架的session
2013/06/24 PHP
thinkphp实现图片上传功能分享
2014/03/04 PHP
9段PHP实用功能的代码推荐
2014/10/14 PHP
php递归函数怎么用才有效
2018/02/24 PHP
Javascript 对象的解释
2008/11/24 Javascript
在jQuery中 常用的选择器介绍
2013/04/16 Javascript
Jquery事件的连接使用示例
2013/06/18 Javascript
向左滚动文字 js代码效果
2013/08/17 Javascript
使用Nodejs开发微信公众号后台服务实例
2014/09/03 NodeJs
js读写json文件实例代码
2014/10/21 Javascript
javascript中alert()与console.log()的区别
2015/08/26 Javascript
全面解析JavaScript中“&amp;&amp;”和“||”操作符(总结篇)
2016/07/18 Javascript
AngularJS 简单应用实例
2016/07/28 Javascript
基于vue cli重构多页面脚手架过程详解
2018/01/23 Javascript
js取小数点后两位四种方法
2019/01/18 Javascript
使用express来代理服务的方法
2019/06/21 Javascript
在Koa.js中实现文件上传的接口功能
2019/10/08 Javascript
[01:28]2014DOTA2国际邀请赛中国区预选赛四大豪门直升机抵达会场
2014/05/24 DOTA
Python轻量级ORM框架Peewee访问sqlite数据库的方法详解
2017/07/20 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
2019/10/17 Python
Python 中的 import 机制之实现远程导入模块
2019/10/29 Python
Python hashlib模块加密过程解析
2019/11/05 Python
python argparser的具体使用
2019/11/10 Python
Python爬虫实现vip电影下载的示例代码
2020/04/20 Python
html5仿支付宝密码框的实现代码
2017/09/06 HTML / CSS
意大利大型购物中心:Oliviero.it
2017/10/19 全球购物
Harman Audio官方商店:购买JBL、Harman Kardon、Infinity和AKG
2019/12/05 全球购物
竞争上岗演讲稿
2014/01/05 职场文书
优秀教师主要事迹
2014/02/01 职场文书
企业员工集体活动方案
2014/08/17 职场文书
夫妻忠诚协议书范本
2014/11/17 职场文书
党员个人总结范文
2015/02/14 职场文书
党员学习中国梦心得体会
2016/01/05 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书
成功的商业计划书这样写才最靠谱
2019/07/12 职场文书
pytorch常用数据类型所占字节数对照表一览
2021/05/17 Python