详解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 相关文章推荐
Firefox outerHTML实现代码
Jun 04 Javascript
JavaScript 浮点数运算 精度问题
Oct 06 Javascript
JavaScript CSS修改学习第二章 样式
Feb 19 Javascript
如何使用Jquery获取Form表单中被选中的radio值
Aug 09 Javascript
jQuery常用数据处理方法小结
Feb 20 Javascript
原生javascript实现的一个简单动画效果
Mar 30 Javascript
JS简单实现tab切换效果的多窗口显示功能
Sep 07 Javascript
JS编写兼容IE6,7,8浏览器无缝自动轮播
Oct 12 Javascript
vue router 跳转时打开新页面的示例方法
Jul 28 Javascript
js实现百度淘宝搜索功能
Feb 17 Javascript
解决Echarts2竖直datazoom滑动后显示数据不全的问题
Jul 20 Javascript
如何用JavaScript学习算法复杂度
Apr 30 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 中英文混合排版中处理字符串常用的函数
2007/04/12 PHP
PHP7新功能总结
2019/04/14 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
2019/10/12 PHP
关于extjs4如何获取grid修改后的数据的问题
2013/08/07 Javascript
js获取select选中的option的text示例代码
2013/12/19 Javascript
jQuery 删除/替换DOM元素的几种方式
2014/05/20 Javascript
javascript的事件触发器介绍的实现
2014/06/05 Javascript
基于jquery实现的树形菜单效果代码
2015/09/06 Javascript
JavaScript实现数据类型的相互转换
2016/03/06 Javascript
jQuery 选择同时包含两个class的元素的实现方法
2016/06/01 Javascript
js 自带的sort() 方法全面了解
2016/08/16 Javascript
jQuery ajax的功能实现方法详解
2017/01/06 Javascript
jQuery插件HighCharts绘制2D柱状图、折线图的组合双轴图效果示例【附demo源码下载】
2017/03/09 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
2017/03/21 jQuery
使用jQuery,Angular实现登录界面验证码详解
2017/04/27 jQuery
基于Node的React图片上传组件实现实例代码
2017/05/10 Javascript
vue如何从接口请求数据
2017/06/22 Javascript
Angular将填入表单的数据渲染到表格的方法
2017/09/22 Javascript
Angular4 ElementRef的应用
2018/02/26 Javascript
基于vue-ssr的静态网站生成器VuePress 初体验
2018/04/17 Javascript
layer弹窗在键盘按回车将反复刷新的实现方法
2019/09/25 Javascript
Python对list列表结构中的值进行去重的方法总结
2016/05/07 Python
python 实现自动远程登陆scp文件实例代码
2017/03/13 Python
Python实现压缩文件夹与解压缩zip文件的方法
2018/09/01 Python
在Python中使用MySQL--PyMySQL的基本使用方法
2019/11/19 Python
VELTRA台湾:世界自由行专家
2017/08/15 全球购物
全球性的女装店:storets
2019/06/12 全球购物
百度吧主申请感言
2014/01/12 职场文书
英文商务邀请信
2014/01/22 职场文书
市场部业务员岗位职责
2014/04/02 职场文书
人力资源求职信
2014/05/25 职场文书
会计专业自荐书
2014/07/08 职场文书
村干部四风问题整改措施
2014/09/30 职场文书
党员三严三实心得体会
2014/10/13 职场文书
警示教育片观后感
2015/06/17 职场文书
开网店计划分析
2019/07/30 职场文书