1. 程式人生 > 程式設計 >解決vue addRoutes不生效問題

解決vue addRoutes不生效問題

動態新增導航欄時,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不生效問題就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。