解决vue addRoutes不生效问题


Posted in Javascript onAugust 04, 2020

动态添加导航栏时,addRoutes不生效解觉

1、在addroutes前,使用router.options.routes=XXXXX的方法手动添加

2、使用作者的方法,在store里维护一个routes对象,然后使用这个对象遍历生成侧面导航栏

解决vue addRoutes不生效问题

补充知识:vue-router 动态添加路由 router.addRoutes(routes)遇到的二次登陆路由冲突问题解决

起因

在当前项目中使用的iview-admin,路由要根据权限动态生成,是在登录后获取当前用户权限内的路由使用 vue-router 的 addRoutes() 方法动态添加到路由表中

遇到的问题

项目目录

...
router
index.js // 路由主配置,路由守卫等
routers.js // 存放页面整体布局和无需权限的路由
store
modules
app.js // 项目通用vuex状态、mutation action等模块
user.js // 用户模块的
index.js // vuex  store的主入口

在router/index.js

import Vue from 'vue'
import Router from 'vue-router'
import routers from './routers' // 导出了路由配置数组项
Vue.use(Router)
const router = new Router({
routers,
mode: 'history'
})
export default router

store/modules/app.js

import router from '@/router' // @ 是src目录, 拿到路由对象
....
router.addRoutes(routes) // routes 为登录后后台接口返回的动态路由
```

此时,如上配置动态路由已经配置完成, 项目也能跑起来,控制台也不会报错和警告,感觉everything is so perfect. 但是在退出登录后,重新登录,打开控制台, 满满的黄色警告 如图

解决vue addRoutes不生效问题

意思就是路由发生了冲突, 这是因为addRoutes 给路由表中添加路由,当退出登录的时候vue实例并木有重新初始化,但是却重新又addRoutes了一次,如果登录的用户相同或者不同用户有同样的权限路由, 那么就会被直接在原来路由表基础上添加,那么自然就会发生路由冲突了,而此时如果刷新页面,vue实例重新初始化就没有这些警告,

问题来了

vue-router 只提供了addRoutes方法 却并没有提供 removeRoutes方法,那么该如何解决这个冲突呢?

解决方式

经过一番搜索与实践,找到了一种方式 , 重置router的matcher

首先修改router/idnex.js

// 原来的
const router = new Router({
routes,
mode: 'history'
})
export router
// 修改为
export const createRouter = (routers) => new Router({
routers,
mode: 'history'
})
const router = createRouter(routers)
export router

其次修改store/modules/app.js

// 原来的
import router from '@/router'
....
router.addRoutes(routes) // routes 为登录后后台接口返回的动态路由
// 修改为
import router, { createRouter } from '@/router'
import routers from '@/router/routers' // 无需配置的那些路由
...
router.matcher = createRouter(routers).matcher
router.addRoutes(routes) // routes 为登录后后台接口返回的动态路由, 在更新菜单menuList前调用
```

如此按照以上的方式即可解决这个问题

以上这篇解决vue addRoutes不生效问题就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
同一页面多个商品倒计时JS 基于面向对象的javascript
Feb 16 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
Dec 03 Javascript
JavaScript插件化开发教程 (三)
Jan 27 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
May 25 Javascript
js判断radiobuttonlist的选中值显示/隐藏其它模块的实现方法
Aug 25 Javascript
JS实现弹出下载对话框及常见文件类型的下载
Jul 13 Javascript
Javascript es7中比较实用的两个方法示例
Jul 21 Javascript
简单实现jQuery手风琴效果
Aug 18 jQuery
Angular中支持SCSS的方法
Nov 18 Javascript
JavaScript多态与封装实例分析
Jul 27 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
Oct 17 Javascript
vue路由 遍历生成复数router-link的例子
Oct 30 Javascript
vue 解决addRoutes多次添加路由重复的操作
Aug 04 #Javascript
Vue优化:常见会导致内存泄漏问题及优化详解
Aug 04 #Javascript
Jquery cookie插件实现原理代码解析
Aug 04 #jQuery
解决vue自定义指令导致的内存泄漏问题
Aug 04 #Javascript
vue中的v-model原理,与组件自定义v-model详解
Aug 04 #Javascript
详解JS深拷贝与浅拷贝
Aug 04 #Javascript
vue addRoutes路由动态加载操作
Aug 04 #Javascript
You might like
虫族 ZERG 概述
2020/03/14 星际争霸
php csv操作类代码
2009/12/14 PHP
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
Symfony2创建页面实例详解
2016/03/18 PHP
yii2超好用的日期组件和时间组件
2016/05/05 PHP
PHP中如何使用Redis接管文件存储Session详解
2018/11/28 PHP
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
Javascript 判断 object 的特定类转载
2007/02/01 Javascript
flexigrid 类似ext grid的JS表格代码
2010/07/17 Javascript
返回对象在当前级别中是第几个元素的实现代码
2011/01/20 Javascript
通过JS自动隐藏手机浏览器的地址栏实现原理与代码
2013/01/02 Javascript
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
js正则表达式的使用详解
2013/07/09 Javascript
为jQuery添加Webkit的触摸的方法分享
2014/02/02 Javascript
fastclick插件导致日期(input[type="date"])控件无法被触发该如何解决
2015/11/09 Javascript
怎么引入(调用)一个JS文件
2016/05/26 Javascript
更靠谱的H5横竖屏检测方法(js代码)
2016/09/13 Javascript
JS实现改变HTML上文字颜色和内容的方法
2016/12/30 Javascript
JS+HTML5实现上传图片预览效果完整实例【测试可用】
2017/04/20 Javascript
原生JS封装animate运动框架的实例
2017/10/12 Javascript
angularJS的radio实现单项二选一的使用方法
2018/02/28 Javascript
解决layer弹出层自适应页面大小的问题
2019/09/16 Javascript
JavaScript console的使用方法实例分析
2020/04/28 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
2020/11/05 Javascript
centos下更新Python版本的步骤
2013/02/12 Python
对Python Class之间函数的调用关系详解
2019/01/23 Python
Python OpenCV中的resize()函数的使用
2019/06/20 Python
如何在django中运行scrapy框架
2020/04/22 Python
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
Uber Eats台湾:寻找附近提供送餐服务的餐厅
2018/05/07 全球购物
日本最大的旅游网站:Rakuten Travel(乐天旅游)
2018/08/02 全球购物
德国游戏机商店:Konsolenkost
2019/12/08 全球购物
护理专业自我鉴定
2014/01/30 职场文书
赡养老人协议书
2014/04/21 职场文书
学生夜不归宿检讨书
2014/09/23 职场文书
小学班级口号大全
2015/12/25 职场文书