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 相关文章推荐
跨浏览器的 mouseenter mouseleave 以及 compareDocumentPosition的使用说明
May 04 Javascript
Ext.get() 和 Ext.query()组合使用实现最灵活的取元素方式
Sep 26 Javascript
javascript 全选与全取消功能的实现代码
Dec 23 Javascript
js jq 单击和双击区分示例介绍
Nov 05 Javascript
JS常用字符串处理方法应用总结
May 22 Javascript
JS实现三级折叠菜单特效,其它级可自动收缩
Aug 06 Javascript
Node.js静态文件服务器改进版
Jan 10 Javascript
AngularJS实现DOM元素的显示与隐藏功能
Nov 22 Javascript
JS实用的带停顿的逐行文本循环滚动效果实例
Nov 23 Javascript
Vue.js计算属性computed与watch(5)
Dec 09 Javascript
如何使用Bootstrap 按钮实例详解
Mar 29 Javascript
关于layui 下拉列表的change事件详解
Sep 20 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
开源SNS系统-ThinkSNS
2008/05/18 PHP
php数组函数序列 之shuffle()和array_rand() 随机函数使用介绍
2011/10/29 PHP
一个php生成16位随机数的代码(两种方法)
2014/09/16 PHP
微信随机生成红包金额算法php版
2016/07/21 PHP
JavaScript 申明函数的三种方法 每个函数就是一个对象(一)
2009/12/04 Javascript
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
使用jQuery在对象中缓存选择器的简单方法
2015/06/30 Javascript
jQuery插件实现文字无缝向上滚动效果代码
2016/02/25 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
jQuery EasyUI菜单与按钮详解
2016/07/13 Javascript
javascript insertAfter()定义与用法示例
2016/07/25 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
layui表格实现代码
2017/05/20 Javascript
利用pm2部署多个node.js项目的配置教程
2017/10/22 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
vue基于两个计算属性实现选中和全选功能示例
2019/02/08 Javascript
JavaScript实现图片的放大缩小及拖拽功能示例
2019/05/14 Javascript
vue ajax 拦截原理与实现方法示例
2019/11/29 Javascript
[06:21]完美世界亚洲区首席发行官竺琦TI3采访
2013/08/26 DOTA
Python减少循环层次和缩进的技巧分析
2016/03/15 Python
Python实现PS图像明亮度调整效果示例
2018/01/23 Python
PyCharm代码格式调整方法
2018/05/23 Python
Python GUI Tkinter简单实现个性签名设计
2018/06/19 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
python openCV获取人脸部分并存储功能
2019/08/28 Python
Python二次规划和线性规划使用实例
2019/12/09 Python
python实现异常信息堆栈输出到日志文件
2019/12/26 Python
Python3.7安装pyaudio教程解析
2020/07/24 Python
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
详解HTML5中CSS外观属性
2020/09/10 HTML / CSS
Clos19英国:高档香槟、葡萄酒和烈酒在线购物平台
2020/07/10 全球购物
屈臣氏泰国官网:Watsons TH
2021/02/23 全球购物
缓刑人员思想汇报
2014/10/11 职场文书
员工聘用合同范本
2015/09/21 职场文书
MYSQL如何查看进程和kill进程
2022/03/13 MySQL