详解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 相关文章推荐
学习YUI.Ext 第二天
Mar 10 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
Jan 30 Javascript
关于JavaScript对象的动态选择及遍历对象
Mar 10 Javascript
jQuery setTimeout传递字符串参数报错的解决方法
Jun 09 Javascript
JavaScript极简入门教程(三):数组
Oct 25 Javascript
JS打字效果的动态菜单代码分享
Aug 21 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
Nov 24 Javascript
手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
Aug 25 Javascript
node中Express 动态设置端口的方法
Aug 04 Javascript
详解Vue微信公众号开发踩坑全记录
Aug 21 Javascript
js推箱子小游戏步骤代码解析
Jan 10 Javascript
微信小程序实现点击导航条切换页面
Nov 19 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错误、异常处理机制(补充)
2012/05/07 PHP
PHP中的self关键字详解
2019/06/23 PHP
JavaScript的单例模式 (singleton in Javascript)
2010/06/11 Javascript
jQuery DOM删除节点操作指南
2015/03/03 Javascript
JSONP之我见
2015/03/24 Javascript
Node.js 异步编程之 Callback介绍(一)
2015/03/30 Javascript
详解参数传递四种形式
2015/07/21 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
2016/11/02 Javascript
浅谈jQuery中事情的动态绑定
2017/02/12 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
js实现单张图片平移切换效果
2017/10/11 Javascript
react中的ajax封装实例详解
2017/10/17 Javascript
详解vue.js之props传递参数
2017/12/12 Javascript
javacript replace 正则取字符串中的值并替换【推荐】
2018/09/13 Javascript
js中async函数结合promise的小案例浅析
2019/04/14 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
[46:47]2014 DOTA2国际邀请赛中国区预选赛5.21 LGD-CDEC VS NE
2014/05/22 DOTA
[01:23:35]Ti4主赛事胜者组 DK vs EG 1
2014/07/19 DOTA
[02:27]2018DOTA2亚洲邀请赛赛前采访-OpTic
2018/04/03 DOTA
python笔记:mysql、redis操作方法
2017/06/28 Python
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
python返回数组的索引实例
2019/11/28 Python
浅析PyCharm 的初始设置(知道)
2020/10/12 Python
zooplus德国:便宜地订购动物用品、动物饲料、动物食品
2020/05/06 全球购物
护士自我评价
2014/02/01 职场文书
2014财务人员自我评价范文
2014/09/21 职场文书
简历中自我评价范文
2015/03/11 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
2015年节能减排工作总结
2015/05/14 职场文书
公司欠款证明
2015/06/24 职场文书
2016国培学习心得体会
2016/01/08 职场文书
浅谈Redis的几个过期策略
2021/05/27 Redis
springboot+VUE实现登录注册
2021/05/27 Vue.js
Python Matplotlib库实现画局部图
2021/11/17 Python
JavaScript展开运算符和剩余运算符的区别详解
2022/02/18 Javascript
Python测试框架pytest高阶用法全面详解
2022/06/01 Python