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 相关文章推荐
jQuery 技巧大全(新手入门篇)
May 12 Javascript
浅析js预加载/延迟加载
Sep 25 Javascript
jQuery获取元素父节点的方法
Jun 21 Javascript
学习使用Bootstrap输入框、导航、分页等常用组件
May 11 Javascript
Vue自定义指令使用方法详解
Aug 21 Javascript
给vue项目添加ESLint的详细步骤
Sep 29 Javascript
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
Jan 17 Javascript
解决vue2.0 element-ui中el-upload的before-upload方法返回false时submit()不生效问题
Aug 24 Javascript
webpack4 升级迁移的实现
Sep 12 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
Jul 16 Javascript
在Koa.js中实现文件上传的接口功能
Oct 08 Javascript
一篇超完整的Vue新手入门指导教程
Nov 18 Vue.js
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
GD输出汉字的函数的分析
2006/10/09 PHP
php array的学习笔记
2012/05/10 PHP
PHP完全二叉树定义与实现方法示例
2017/10/09 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
js 操作select相关方法函数
2009/12/06 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
js对文章内容进行分页示例代码
2014/03/05 Javascript
jQuery中attr()方法用法实例
2015/01/05 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
JavaScript弹窗基础篇
2016/04/27 Javascript
JS实现图片的不间断连续滚动的简单实例
2016/06/03 Javascript
jquery设置表单元素为不可用的简单代码
2016/07/04 Javascript
Jquery树插件zTree实现菜单树
2017/01/24 Javascript
AngularJS表格样式简单设置方法示例
2017/03/03 Javascript
基于js判断浏览器是否支持webGL
2020/04/18 Javascript
Python中实现的RC4算法
2015/02/14 Python
Python运算符重载详解及实例代码
2017/03/07 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
python把转列表为集合的方法
2019/06/28 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
python、PyTorch图像读取与numpy转换实例
2020/01/13 Python
手把手教你进行Python虚拟环境配置教程
2020/02/03 Python
简单了解Python字典copy与赋值的区别
2020/09/16 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
2021/02/02 Python
html5生成柱状图(条形图)效果的实例代码
2016/03/25 HTML / CSS
投资意向书范本
2014/04/01 职场文书
考核评语大全
2014/04/29 职场文书
党员学习群众路线教育实践活动对照检查材料
2014/09/23 职场文书
民主评议教师党员自我评价
2015/03/04 职场文书
电力工程合作意向书
2015/05/11 职场文书
小爸爸观后感
2015/06/15 职场文书
高端收音机+蓝牙音箱,JBL TUNER FM带收音蓝牙音箱评测
2021/04/24 无线电
python文本处理的方案(结巴分词并去除符号)
2021/05/26 Python
python 开心网和豆瓣日记爬取的小爬虫
2021/05/29 Python
利用Python实现模拟登录知乎
2022/05/25 Python