详解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 相关文章推荐
jquery 框架使用教程 AJAX篇
Oct 11 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
Sep 13 Javascript
angularJS 中$scope方法使用指南
Feb 09 Javascript
JavaScript导航脚本判断当前导航
Jul 12 Javascript
JS表单数据验证的正则表达式(常用)
Feb 18 Javascript
浅谈箭头函数写法在ReactJs中的使用
Aug 22 Javascript
vue打包后显示空白正确处理方法
Nov 01 Javascript
js 索引下标之li集合绑定点击事件
Jan 12 Javascript
深入浅析Vue.js计算属性和侦听器
May 05 Javascript
vue中如何去掉空格的方法实现
Nov 09 Javascript
详解a标签添加onclick事件的几种方式
Mar 29 Javascript
JavaScript实现背景自动切换小案例
Sep 27 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/01/02 PHP
自定义php类(查找/修改)xml文档
2013/03/26 PHP
探讨php中header的用法详解
2013/06/07 PHP
深入解析Session是否必须依赖Cookie
2013/08/02 PHP
jQuery 1.0.4 - New Wave Javascript(js源文件)
2007/01/15 Javascript
jquery中实现标签切换效果的代码
2011/03/01 Javascript
jQuery代码优化之基本事件
2011/11/01 Javascript
EasyUI中的tree用法介绍
2011/11/01 Javascript
chrome原生方法之数组
2011/11/30 Javascript
简单的邮箱登陆的提示效果类似于yahoo邮箱
2014/02/26 Javascript
js登录弹出层特效
2014/03/07 Javascript
js处理表格对table进行修饰
2014/05/26 Javascript
DOM操作一些常用的属性汇总
2015/03/13 Javascript
JQuery插件Quicksand实现超炫的动画洗牌效果
2015/05/03 Javascript
JS获取鼠标坐标并且根据鼠标位置不同弹出不同内容
2017/06/12 Javascript
vue实现简单的星级评分组件源码
2018/11/16 Javascript
vue 动态添加class,三个以上的条件做判断方式
2020/11/02 Javascript
Python实现购物系统(示例讲解)
2017/09/13 Python
Python环境搭建之OpenCV的步骤方法
2017/10/20 Python
Python实现的选择排序算法示例
2017/11/29 Python
基于python内置函数与匿名函数详解
2018/01/09 Python
Python提取频域特征知识点浅析
2019/03/04 Python
Python自定义一个异常类的方法
2019/06/27 Python
Python-Tkinter Text输入内容在界面显示的实例
2019/07/12 Python
Python 寻找局部最高点的实现
2019/12/05 Python
numpy.ndarray 实现对特定行或列取值
2019/12/05 Python
keras的siamese(孪生网络)实现案例
2020/06/12 Python
LORAC官网:美国彩妆品牌
2019/08/27 全球购物
武汉东之林科技有限公司机试
2013/09/17 面试题
销售团队口号大全
2014/06/06 职场文书
中文专业自荐书
2014/06/29 职场文书
四查四看整改措施
2014/09/19 职场文书
2014学校领导四风对照检查材料思想汇报
2014/09/23 职场文书
初三英语教学计划
2015/01/23 职场文书
网络妈妈观后感
2015/06/08 职场文书
Nginx服务器如何设置url链接
2021/03/31 Servers