Vue動(dòng)態(tài)路由路徑重復(fù)及刷新丟失頁(yè)面問題的解決
Vue動(dòng)態(tài)路由路徑重復(fù)及刷新丟失頁(yè)面
1.使用router.addRoutes(teacherRouter);
添加完路由切換路由時(shí),vue會(huì)警告路由名字重復(fù)
問題出現(xiàn)原因是:動(dòng)態(tài)路由添加時(shí)調(diào)傭addRoutes();它只會(huì)幫你注入路由,不會(huì)幫你把前面的路由清掉。如此一來(lái)就重復(fù)添加了。
解決方法:路由動(dòng)態(tài)添加關(guān)鍵頁(yè)面需要在路由配置頁(yè)(router/index.js)添加自定義方法
router.$addRoutes = params => { ? router.matcher = new Router({ ? ? routes: router.options.routes // 關(guān)鍵代碼 ? }).matcher; ? router.addRoutes(params); };
2.問題
在添加后進(jìn)行頁(yè)面刷新后,動(dòng)態(tài)添加的路由會(huì)消失,路勁找不到
可以使用localstorage緩存,頁(yè)面路由權(quán)限判斷頁(yè)(promission.js)用了路由beforeEach可以直接判斷路由刷新:
if (from.name === null) { ? ? ? // 刷新 ? ? ? router.$addRoutes(accessRoutes); ? ? ? // 確保頁(yè)面加載完成 ? ? ? next({ ...to, replace: true }); ? }?
3.問題
切換不同角色權(quán)限,之前動(dòng)態(tài)添加的路由沒有被清除,進(jìn)入看到的還是上次進(jìn)入的權(quán)限頁(yè)面。
問題在于vue的store沒有被清空,把store里的route清空就行:
可以在退出登錄設(shè)置,也可以在添加路由時(shí)清空,以下代碼為store內(nèi)permission.js添加動(dòng)態(tài)路由前清空路由
const mutations = { ? SET_ROUTES: (state, routes) => { ? ? state.addRoutes = routes; ? ? state.routes = constantRoutes.concat(routes); ? }, ? RESET_ROUTES: (state, payLoad) => { ? ? state.addRoutes = []; ? ? state.routes = []; ? } };?
generateRoutes({ commit }, roles) { ? ? return new Promise(resolve => { ? ? ? // 關(guān)鍵代碼 == 添加路由前將路由重置為空 ? ? ? commit("RESET_ROUTES"); ? ? ? // 設(shè)置登錄的路由權(quán)限 ? ? ? let accessedRoutes; ? ? ? ? ?if (roles === 4) { ? ? ? ? // 教師登錄 ? ? ? ?accessedRoutes = teacherRouter; ? ? ?} ? ? ?if (roles === 3) { ? ? ? ?// 學(xué)生登錄 ? ? ? ?accessedRoutes = studentRouter; ? ? ?} ? ? ?commit("SET_ROUTES", accessedRoutes); ? ? ?resolve(accessedRoutes); ? ?});?
Vue路由動(dòng)態(tài)添加重復(fù)警告重復(fù)
動(dòng)態(tài)添加路由后,控制臺(tái)警告重復(fù),在router.js中添加下面代碼
const createRouter = () => new Router({ ?? ? mode: 'history', ?? ? routes: constantRoutes }) const router = createRouter() export function resetRouter () { ?? ?const newRouter = createRouter() ?? ?router.matcher = newRouter.matcher } export default router
addRoutes()方法是router自帶的原生方法,是動(dòng)態(tài)添加路由的,它并沒有刪除之前路由中原有的路由所以在permission.js中引入router,并且添加在addRoutes之前resetRouter
import router,{resetRouter} from './router' store.dispatch('GenerateRoutes').then(accessRoutes => { ? ? // 根據(jù)roles權(quán)限生成可訪問的路由表 ?? ?resetRouter() ?? ?router.addRoutes(accessRoutes)// 動(dòng)態(tài)添加可訪問路由表 })
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue elementui table編輯表單時(shí)彈框增加編輯明細(xì)數(shù)據(jù)的實(shí)現(xiàn)
在Vue項(xiàng)目中,通過使用Element UI框架實(shí)現(xiàn)表單及其明細(xì)數(shù)據(jù)的新增和編輯操作,主要通過彈窗形式進(jìn)行明細(xì)數(shù)據(jù)的增加和編輯,有效提升用戶交互體驗(yàn),本文詳細(xì)介紹了相關(guān)實(shí)現(xiàn)方法和代碼,適合需要在Vue項(xiàng)目中處理復(fù)雜表單交互的開發(fā)者參考2024-10-10vue.js中使用微信掃一掃解決invalid signature問題(完美解決)
這篇文章主要介紹了vue.js中使用微信掃一掃解決invalid signature問題(推薦),本文通過實(shí)例代碼給出解決方法,代碼簡(jiǎn)單易懂非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04vue.js動(dòng)態(tài)修改background-image問題
這篇文章主要介紹了vue.js動(dòng)態(tài)修改background-image問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-08-08詳解el Cascader懶加載數(shù)據(jù)回顯示例
這篇文章主要為大家介紹了詳解el Cascader懶加載數(shù)據(jù)回顯示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11淺談Vue內(nèi)置component組件的應(yīng)用場(chǎng)景
這篇文章主要介紹了淺談Vue內(nèi)置component組件的應(yīng)用場(chǎng)景,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2018-03-03使用 Element UI Table 的 slot-scope方法
這篇文章主要介紹了使用 Element UI Table 的 slot-scope方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10vue 使某個(gè)組件不被 keep-alive 緩存的方法
今天小編就為大家分享一篇vue 使某個(gè)組件不被 keep-alive 緩存的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-09-09詳解vue父子組件關(guān)于模態(tài)框狀態(tài)的綁定方案
這篇文章主要介紹了詳解vue父子組件關(guān)于模態(tài)框狀態(tài)的綁定方案,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2019-06-06element-plus一個(gè)vue3.xUI框架(element-ui的3.x 版初體驗(yàn))
這篇文章主要介紹了element-plus一個(gè)vue3.xUI框架(element-ui的3.x 版初體驗(yàn)),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12