vue动态添加路由addRoutes之不能将动态路由存入缓存的解决


Posted in Javascript onFebruary 19, 2019

在我不知道vue的路由还可以通过addRoutes动态添加时,我只知道vue的路由都是写死在路由表中的,每当跳转时再去加载相应的路由。直到在一个新公司接到需要根据用户的权限显示不同的菜单的需求时才知道了原来vue-router还有一个addRoutes的API,立马研究了一下。

router.addRoutes:

函数签名:

router.addRoutes(routes: Array<RouteConfig>)

动态添加更多的路由规则。参数必须是一个符合routes选项要求的数组。

点这里去看router.addRoutes的官方解释

白话就是需要动态加入到路由表中的路由是必须要跟我们提前写死的路由规则是一样的。

有了这个玩意儿我们就可以依据系统管理员给用户分配的权限来实现不同的用户可以进入不同的菜单页面的功能,是不是很nice?是不是很优秀?

但这个还不是本文的重点,本文的重点是“不能将需要动态添加的路由存入缓存!” 为什么这么说呢?

先说说我们的需求吧。

我们的项目开发中的动态路由是提前配好在路由表中的,只是和静态路由分开写在了两个对象中,导出的时候默认只导出静态路由,所谓的静态路由就是所有用户都可以访问到的公共路由,比如登录页面、404页面等。而不同用户可访问不同的菜单页面是根据接口返回的一个菜单code来过滤提前配好的动态路由(提前配好的动态路由中也有一个code),再将过滤后的路由使用router.addRoutes动态添加即可。可能有些公司是通过接口直接把用户的动态路由表按照路由的规则形式给返回了出来,前端只需拿到路由表稍作处理然后addRoutes就可以了。每个公司有每个公司的想法,你开心就好!

接下来就是我们项目中的路由过滤了,这里省略1000字,路由过滤完成并动态添加后就可以很愉快的访问菜单页面了。但我想的是,在全局路由守卫中请求接口返回的code(这里接口返回的是一个包含code和其他数据的json数组,所以我还得先把接口返回的code给过滤出来),然后再过滤路由,然后再动态添加,这对性能来说是一个不小的开销,所以我就琢磨着能不能把首次过滤好的路由给存在缓存中,这样下次就可以直接动态添加缓存中的路由了,岂不是是一件很美好的事情,结果是我想错了,你们都想错了!

来先看看过滤后打印出来的路由吧:

vue动态添加路由addRoutes之不能将动态路由存入缓存的解决

再来看看从缓存中读出来的路由吧:

vue动态添加路由addRoutes之不能将动态路由存入缓存的解决

从两张图上红色矩形圈圈可以看出,从缓存中读出来的路由信息已经发生了改变,父路由中的render方法也没有了(第一张图中父路由的render方法还是有的,到了第二张就没有了),且子路由children里边已经没有了component属性(从第二张图中的红色箭头处可以看出),这显然不是我们想要的路由信息。有人说可以使用import xxx from ‘xxx'来替代component的值,这个针对父路由的component都引用了同一个Layout组件来说是可以的,但是子路由呢?从缓存中读出来的子路由连component都没有了,即使是有这个属性,但子路由都引用了不同的component,那你怎么玩?况且将过滤后的路由信息通过缓存的存取来实现,安全上就会有问题,因为如果户手动修改了缓存里的路由,那你所谓的动态路由权限岂不是立马破功了。

所以,我们能做的就只能是在每次切换路由时都要重新请求接口并根据返回的code来动态过滤路由并添加,或者根据后端返回的动态路由表直接添加,性能上浪费一点也是没有办法的事儿,总比实现不了或不安全来的更好一点。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
理解JavaScript中的对象 推荐
Jan 09 Javascript
JavaScript实现多维数组的方法
Nov 20 Javascript
jQuery基础知识小结
Dec 22 Javascript
JavaScript DOM操作表格及样式
Apr 13 Javascript
全面了解JavaScript的数据类型转换
Jul 01 Javascript
JS封装的三级联动菜单(使用时只需要一行js代码)
Oct 24 Javascript
jQuery选择器_动力节点Java学院整理
Jul 05 jQuery
vue开发调试神器vue-devtools使用详解
Jul 13 Javascript
Fetch超时设置与终止请求详解
May 18 Javascript
使用Vue.js 和Chart.js制作绚丽多彩的图表
Jun 15 Javascript
React路由鉴权的实现方法
Sep 05 Javascript
json字符串对象转换代码实例
Sep 28 Javascript
jQuery选择器之基本过滤选择器用法实例分析
Feb 19 #jQuery
Vue 实现手动刷新组件的方法
Feb 19 #Javascript
jQuery选择器之层次选择器用法实例分析
Feb 19 #jQuery
jQuery选择器之基本选择器用法实例分析
Feb 19 #jQuery
jQuery实现为table表格动态添加或删除tr功能示例
Feb 19 #jQuery
详解vue几种主动刷新的方法总结
Feb 19 #Javascript
jQuery事件多次绑定与解绑问题实例分析
Feb 19 #jQuery
You might like
PHP中基本符号及使用方法
2010/03/23 PHP
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
2014/01/30 PHP
PHP远程采集图片详细教程
2014/07/01 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
BOM与DOM的区别分析
2010/10/26 Javascript
关于extjs treepanel复选框选中父节点与子节点的问题
2013/04/02 Javascript
js控制的遮罩层实例介绍
2013/05/29 Javascript
JS实现匀速运动的代码实例
2013/11/29 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
使用Javascript写的2048小游戏
2015/11/25 Javascript
AngularJS入门心得之directive和controller通信过程
2016/01/25 Javascript
javascript使用Promise对象实现异步编程
2016/03/01 Javascript
JavaScript中的Array 对象(数组对象)
2016/06/02 Javascript
jQuery弹出下拉列表插件(实现kindeditor的@功能)
2016/08/16 Javascript
基于 Bootstrap Datetimepicker 联动
2017/08/03 Javascript
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
2019/06/26 Javascript
three.js 实现露珠滴落动画效果的示例代码
2021/03/01 Javascript
[46:04]Liquid vs VP Supermajor决赛 BO 第四场 6.10
2018/07/05 DOTA
详解Python设计模式编程中观察者模式与策略模式的运用
2016/03/02 Python
利用python将xml文件解析成html文件的实现方法
2017/12/22 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
Python八皇后问题解答过程详解
2019/07/29 Python
Python PO设计模式的具体使用
2019/08/16 Python
JetBrains PyCharm(Community版本)的下载、安装和初步使用图文教程详解
2020/03/19 Python
解决pytorch 交叉熵损失输出为负数的问题
2020/07/07 Python
用python读取xlsx文件
2020/12/17 Python
瑞士领先的网上超市:LeShop.ch
2018/11/14 全球购物
管理科学大学生求职信
2013/11/13 职场文书
口头翻译求职人自荐信
2013/12/07 职场文书
十岁生日父母答谢词
2014/01/18 职场文书
2016年中学端午节主题活动总结
2016/04/01 职场文书
教你用Python+selenium搭建自动化测试环境
2021/06/18 Python
修改并编译golang源码的操作步骤
2021/07/25 Golang
MySQL中IO问题的深入分析与优化
2022/04/02 MySQL
BCL经典机 SONY ICF-5900W电路分析
2022/04/24 无线电
vue里使用create, mounted调用方法
2022/04/26 Vue.js