详解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跨域和ajax 跨域问题的实现思路
Sep 05 Javascript
jQuery 验证插件 Web前端设计模式(asp.net)
Oct 17 Javascript
JS实现切换标签页效果实例代码
Nov 01 Javascript
jQuery实现简单网页遮罩层/弹出层效果兼容IE6、IE7
Jun 16 Javascript
JavaScript中的slice()方法使用详解
Jun 06 Javascript
基于JavaScript判断浏览器到底是关闭还是刷新(超准确)
Feb 01 Javascript
理解JavaScript原型链
Oct 25 Javascript
jQuery插件FusionWidgets实现的AngularGauge图效果示例【附demo源码】
Mar 23 jQuery
ionic 3.0+ 项目搭建运行环境的教程
Aug 09 Javascript
基于js Canvas实现二次贝塞尔曲线
Dec 25 Javascript
vue 组件中使用 transition 和 transition-group实现过渡动画
Jul 09 Javascript
利用JS判断元素是否为数组的方法示例
Jan 08 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
PHP5中的this,self和parent关键字详解教程
2007/03/19 PHP
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
火车采集器 免费版使出收费版本功能实现原理
2009/09/17 PHP
表单提交错误后返回内容消失问题的解决方法(PHP网站)
2015/10/20 PHP
开启PHP的伪静态模式
2015/12/31 PHP
yii2实现分页,带搜索的分页功能示例
2017/01/07 PHP
PDO::getAvailableDrivers讲解
2019/01/28 PHP
Yii框架视图、视图布局、视图数据块操作示例
2019/10/14 PHP
JS的replace方法介绍
2012/10/20 Javascript
jQuery实现的原图对比窗帘效果
2014/06/15 Javascript
EasyUI中combobox默认值注意事项
2015/03/01 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
分享Javascript实用方法二
2015/12/13 Javascript
js实现浏览器倒计时跳转页面效果
2016/08/12 Javascript
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
sharp.js安装过程中遇到的问题总结
2020/04/02 Javascript
用Python制作检测Linux运行信息的工具的教程
2015/04/01 Python
Python实现程序的单一实例用法分析
2015/06/03 Python
python 安装virtualenv和virtualenvwrapper的方法
2017/01/13 Python
Python使用base64模块进行二进制数据编码详解
2018/01/11 Python
利用python如何处理nc数据详解
2018/05/23 Python
python 基本数据类型占用内存空间大小的实例
2018/06/12 Python
python使用pip安装SciPy、SymPy、matplotlib教程
2019/11/20 Python
基于HTML5+Webkit实现树叶飘落动画
2017/12/28 HTML / CSS
Peter Alexander新西兰站:澳大利亚领先的睡衣设计师品牌
2016/12/10 全球购物
英国奢侈品概念店:Base Blu
2019/05/16 全球购物
物流仓储计划书
2014/01/10 职场文书
中国梦演讲稿教师篇
2014/04/23 职场文书
奥林匹克的口号
2014/06/13 职场文书
讲文明懂礼貌演讲稿
2014/09/11 职场文书
学习型党组织心得体会
2014/09/12 职场文书
2014年销售工作总结与计划
2014/12/01 职场文书
高中生思想道德自我评价
2015/03/09 职场文书
百善孝为先:关于孝道的经典语录
2019/10/18 职场文书
Django开发RESTful API实现增删改查(入门级)
2021/05/10 Python
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python