vue動(dòng)態(tài)路由刷新失效以及404頁(yè)面處理辦法
前言
在開(kāi)發(fā)后臺(tái)管理項(xiàng)目,我們會(huì)使用vue動(dòng)態(tài)路由做權(quán)限管理,但是使用vue動(dòng)態(tài)路由時(shí)會(huì)遇到一些坑,這里總結(jié)一下,并提供解決思路
1.動(dòng)態(tài)路由刷新頁(yè)面失效問(wèn)題
問(wèn)題:刷新頁(yè)面時(shí)會(huì)把a(bǔ)ddRouter添加的動(dòng)態(tài)路由刷新掉,因此瀏覽器找不到之前添加的路由,便會(huì)進(jìn)入白屏頁(yè)面或者404頁(yè)面
處理方式:判斷是否刷新頁(yè)面 如果刷新在路由守衛(wèi)中再次添加動(dòng)態(tài)路由
把添加的動(dòng)態(tài)路由存入瀏覽器緩存和vuex或pinia中 如果刷新頁(yè)面vuex和pinia存的內(nèi)容將會(huì)丟失以此來(lái)判斷是否刷新頁(yè)面 然后從瀏覽器緩存中拿到再重新添加
router.beforeEach((to, from, next) => { if(store.userRouter.length || to.path == '/' || to.path == '/index'){ next() //如果登錄頁(yè)或首頁(yè) 或 vuex中有動(dòng)態(tài)路由數(shù)據(jù) 直接通過(guò) }else{ //拿到瀏覽器緩存中動(dòng)態(tài)路由的數(shù)據(jù) 重新添加 const data = JSON.parse( localStorage.getItem('userRouter')) store.userRouter = data //重新復(fù)制給store data.forEach(e=>{ //循環(huán)添加路由 router.addRoute(e) }) next(to.path) //添加完成后再次進(jìn)入 } })
注意使用pinia在router配置文件中訪問(wèn)不到store,建議寫(xiě)在mian.js
userRouter為自定義變量 格式為數(shù)組包裹addRoute所需數(shù)組
2.動(dòng)態(tài)路由搭配404頁(yè)面使用
如果我們配置了404頁(yè)面 用以上方式進(jìn)入動(dòng)態(tài)路由頁(yè)面還是會(huì)進(jìn)入404頁(yè)面 我們需要將404頁(yè)面的路由也動(dòng)態(tài)追加
router.beforeEach((to, from, next) => { if(store.userRouter.length || to.path == '/' || to.path == '/index'){ next() //如果登錄頁(yè)或首頁(yè) 或 vuex中有動(dòng)態(tài)路由數(shù)據(jù) 直接通過(guò) }else{ //拿到瀏覽器緩存中動(dòng)態(tài)路由的數(shù)據(jù) 重新添加 const data = JSON.parse( localStorage.getItem('userRouter')) store.userRouter = data //重新復(fù)制給store data.forEach(e=>{ //循環(huán)添加路由 router.addRoute(e) }) //添加404動(dòng)態(tài)路由 router.addRoute({ path: "/:catchAll(.*)", redirect: "/404", }) next(to.path) //添加完成后再次進(jìn)入 } })
附:了解動(dòng)態(tài)路由
我這里說(shuō)的動(dòng)態(tài)路由指的是,由后端提供當(dāng)前角色可以訪問(wèn)的所有路徑,前端提前寫(xiě)好路徑與組件之間的映射也就是route,然后根據(jù)后端返回的url進(jìn)行匹配,將匹配到的route加入到router里面。
后端返回的數(shù)據(jù)大概是這樣:
提前寫(xiě)好的route的path一定要和上面的url對(duì)應(yīng):
export default { path: '/main/analysis/overview', name: 'overview', component: overview, children: [] }
動(dòng)態(tài)添加就是遍歷咱們上面提前寫(xiě)好的所有routes,看有沒(méi)有和后端返回的url一樣的,有到時(shí)候我們就先放到數(shù)組routes里,后面通過(guò)router.addRoute加入到路由里面去即可:
const routes = mapMenusToRoutes(userMenu) routes.forEach((route) => { router.addRoute('main', route) })
總結(jié)
到此這篇關(guān)于vue動(dòng)態(tài)路由刷新失效以及404頁(yè)面處理辦法的文章就介紹到這了,更多相關(guān)vue動(dòng)態(tài)路由刷新失效404內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue實(shí)現(xiàn)圖片加載完成前的loading組件方法
下面小編就為大家分享一篇vue實(shí)現(xiàn)圖片加載完成前的loading組件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-02-02Vue實(shí)現(xiàn)table上下移動(dòng)功能示例
這篇文章主要介紹了Vue實(shí)現(xiàn)table上下移動(dòng)功能,結(jié)合實(shí)例形式分析了vue.js針對(duì)table表格元素動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-02-02前端token中4個(gè)存儲(chǔ)位置的優(yōu)缺點(diǎn)說(shuō)明
這篇文章主要介紹了前端token中4個(gè)存儲(chǔ)位置的優(yōu)缺點(diǎn)說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10JavaScript的MVVM庫(kù)Vue.js入門(mén)學(xué)習(xí)筆記
這篇文章主要介紹了JavaScript的MVVM庫(kù)Vue.js入門(mén)學(xué)習(xí)筆記,Vue.js是一個(gè)新興的js庫(kù),主要用于實(shí)現(xiàn)響應(yīng)的數(shù)據(jù)綁定和組合的視圖組件,需要的朋友可以參考下2016-05-05Vue監(jiān)聽(tīng)頁(yè)面變化的實(shí)現(xiàn)方法小結(jié)
在Vue.js應(yīng)用開(kāi)發(fā)過(guò)程中,監(jiān)聽(tīng)頁(yè)面變化是一個(gè)非常常見(jiàn)的需求,無(wú)論是為了響應(yīng)用戶交互、優(yōu)化性能,還是實(shí)現(xiàn)復(fù)雜的業(yè)務(wù)邏輯,監(jiān)聽(tīng)頁(yè)面變化的能力都是不可或缺的,本文將詳細(xì)介紹如何在Vue項(xiàng)目中實(shí)現(xiàn)頁(yè)面變化監(jiān)聽(tīng),需要的朋友可以參考下2024-10-10vue點(diǎn)擊右鍵出現(xiàn)自定義操作菜單實(shí)現(xiàn)代碼
這篇文章主要給大家介紹了關(guān)于vue點(diǎn)擊右鍵出現(xiàn)自定義操作菜單實(shí)現(xiàn)的相關(guān)資料,在網(wǎng)頁(yè)中我們也希望可以像桌面軟件一樣,點(diǎn)擊右鍵后出現(xiàn)操作菜單,對(duì)選中的數(shù)據(jù)項(xiàng)進(jìn)行相應(yīng)的操作,需要的朋友可以參考下2023-08-08淺談vue-props的default寫(xiě)不寫(xiě)有什么區(qū)別
這篇文章主要介紹了淺談vue-props的default寫(xiě)不寫(xiě)有什么區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08