详解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 相关文章推荐
dotopAlert 提示用户需安装播放器的代码
Sep 17 Javascript
在每个匹配元素的外部插入新元素的方法
Dec 20 Javascript
jQuery中常用的遍历函数用法实例总结
Sep 01 Javascript
jquery+json实现动态商品内容展示的方法
Jan 14 Javascript
Bootstrap Table从服务器加载数据进行显示的实现方法
Sep 29 Javascript
node.js文件上传处理示例
Oct 27 Javascript
使用bat打开多个cmd窗口执行gulp、node
Feb 17 Javascript
JavaScript数据结构与算法之二叉树遍历算法详解【先序、中序、后序】
Feb 21 Javascript
浅谈发布订阅模式与观察者模式
Apr 09 Javascript
Vue+tracking.js 实现前端人脸检测功能
Apr 16 Javascript
js+h5 canvas实现图片验证码
Oct 11 Javascript
vue-router中hash模式与history模式的区别
Jun 23 Vue.js
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
使用网络地址转换实现多服务器负载均衡
2006/10/09 PHP
php中常见的sql攻击正则表达式汇总
2014/11/06 PHP
php使用gzip压缩传输js和css文件的方法
2015/07/29 PHP
PHP生成word文档的三种实现方式
2016/11/14 PHP
PHP实现一个按钮点击上传多个图片操作示例
2020/01/23 PHP
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
JavaScript Array对象扩展indexOf()方法
2014/05/09 Javascript
jquery地址栏链接与a标签链接匹配之特效代码总结
2015/08/24 Javascript
jQuery实现textarea自动增长宽高的方法
2015/12/18 Javascript
基于javascript实现listbox左右移动
2016/01/29 Javascript
javascript正则表达式总结
2016/02/29 Javascript
详解Bootstrap各式各样的按钮(推荐)
2016/12/13 Javascript
js实现简单的手风琴效果
2017/02/27 Javascript
JS组件系列之MVVM组件构建自己的Vue组件
2017/04/28 Javascript
vue 路由页面之间实现用手指进行滑动的方法
2018/02/23 Javascript
Angularjs Promise实例详解
2018/03/15 Javascript
vue中v-cloak解决刷新或者加载出现闪烁问题(显示变量)
2018/04/20 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
微信小程序实现拼图小游戏
2020/10/22 Javascript
[01:06:25]Secret vs Liquid 2018国际邀请赛淘汰赛BO3 第一场 8.25
2018/08/29 DOTA
Python可变参数函数用法实例
2015/07/07 Python
Pandas:DataFrame对象的基础操作方法
2018/06/07 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
2018/12/19 Python
PyCharm安装Markdown插件的两种方法
2019/06/24 Python
python并发编程 Process对象的其他属性方法join方法详解
2019/08/20 Python
Python + selenium + crontab实现每日定时自动打卡功能
2020/03/31 Python
JAVA及PYTHON质数计算代码对比解析
2020/06/10 Python
python绘制分布折线图的示例
2020/09/24 Python
ktv收银员岗位职责
2013/12/16 职场文书
报告会主持词
2014/04/02 职场文书
老人与海读书笔记
2015/06/26 职场文书
会计手工模拟做账心得体会
2016/01/22 职场文书
创业方案:赚钱的烧烤店该怎样做?
2019/07/05 职场文书
vue实现同时设置多个倒计时
2021/05/20 Vue.js
5分钟教你docker安装启动redis全教程(全新方式)
2021/05/29 Redis