vue 動(dòng)態(tài)添加的路由頁(yè)面刷新時(shí)失效的原因及解決方案
問(wèn)題描述
昨天在做vue后臺(tái)管理系統(tǒng)有關(guān)權(quán)限頁(yè)面動(dòng)態(tài)添加到路由的功能時(shí),遇到一個(gè)問(wèn)題:動(dòng)態(tài)添加的路由頁(yè)面,在頁(yè)面刷新時(shí)出現(xiàn)了404的情況。
場(chǎng)景
后臺(tái)管理系統(tǒng)的權(quán)限控制是通過(guò)在前端頁(yè)面定義權(quán)限code, 把code給后臺(tái)同學(xué)保存配置到表中,之后根據(jù)后臺(tái)返回的權(quán)限code列表與前端頁(yè)面配置的code菜單列表做篩選匹配,code相等的頁(yè)面就是有權(quán)限的頁(yè)面,再通過(guò)router.addRoute()動(dòng)態(tài)添加到路由中,有權(quán)限的路由才可以被訪問(wèn),否則會(huì)提示無(wú)權(quán)限。
固定路由一開(kāi)始就會(huì)放在new Router中,比如登錄頁(yè)面login
接口返回
前端菜單定義
vuex中的方法
出現(xiàn)的問(wèn)題
登錄后,通過(guò)調(diào)用vuex中的方法,完成獲取權(quán)限code,動(dòng)態(tài)篩選權(quán)限路由頁(yè)面操作,然后通過(guò)router.addRoute()將有權(quán)限菜單添加到路由中,進(jìn)入動(dòng)態(tài)添加的路由頁(yè)面,刷新頁(yè)面出現(xiàn)404
原因分析
頁(yè)面刷新時(shí),路由重新初始化,動(dòng)態(tài)添加的路由此時(shí)已不存在,只有一些固定路由(比如登錄頁(yè)面)還在,所以出現(xiàn)了404的情況
解決方案
VUEX store中存儲(chǔ)的數(shù)據(jù)會(huì)在頁(yè)面刷新時(shí)清空。
在路由的全局導(dǎo)航router.beforeEach處做個(gè)判斷,根據(jù)VUEX中存放的list是否有值來(lái)判斷頁(yè)面是否是刷新,如果不為0,則是第一次登陸,登錄后會(huì)走匹配路由的方法,不會(huì)有問(wèn)題;如果list.length為0,就為刷新頁(yè)面,需要重新執(zhí)行路由匹配,重新添加動(dòng)態(tài)路由即可。
實(shí)現(xiàn)代碼 route/index.js的導(dǎo)航守衛(wèi)中添加邏輯判斷
———router.js————-
const constantRoutes = [ { path: '/', redirect: '/login' }, { path: '/login', name: 'login', meta: { auth: false }, component: () => import('@/views/login') }, { path: '/layout', name: 'layout', meta: { auth: true }, component: () => import('@/views/layout/index'), children: [ { path: '/index', name: 'index', component: () => import('@/views/home') } ] }, { path: '*', component: () => import('@/views/error/404') } ] Vue.use(VueRouter) const createRouter = () => new VueRouter({ routes: constantRoutes }) export function resetRouter() { const newRouter = createRouter() router.matcher = newRouter.matcher // reset router } const router = createRouter() //頁(yè)面刷新后重新設(shè)置權(quán)限頁(yè)面動(dòng)態(tài)路由,防止出現(xiàn)動(dòng)態(tài)路由404問(wèn)題 const reSetPermissionList = to => { return new Promise((resolve, reject) => { if (to.path !== '/login' && store.state.permission.permissionList.length === 0) { store .dispatch('permission/getPermissionList') .then(() => { resolve('permCode') }) .catch(error => { resolve('permCode') }) } else { resolve() } }) } router.beforeEach((to, from, next) => { const accessToken = localStorage.getItem('accessToken') if (_.isEmpty(accessToken)) {//是否已經(jīng)登錄 否 去登陸頁(yè)面 next({ path: '/login', query: { redirect: to.fullPath } }) } else { //已登錄用戶進(jìn)入頁(yè)面 if (to.path === '/login') { next({ path: '/index' }) } else { reSetPermissionList(to).then(data => { data === 'permCode' ? next({ path: to.path, query: to.query }) : next() }) } } })
總結(jié)
主要通過(guò)在全局導(dǎo)航處判斷VUEX中的數(shù)據(jù)是否存在,判斷頁(yè)面是否刷新,是的話重新走一遍權(quán)限路由匹配的方法。
以上就是vue動(dòng)態(tài)添加的路由頁(yè)面刷新時(shí)失效的原因及解決方案的詳細(xì)內(nèi)容,更多關(guān)于vue 路由頁(yè)面刷新的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue SSR 即時(shí)編譯技術(shù)的實(shí)現(xiàn)
這篇文章主要介紹了Vue SSR 即時(shí)編譯技術(shù)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05vue中axios利用blob實(shí)現(xiàn)文件瀏覽器下載方式
這篇文章主要介紹了vue中axios利用blob實(shí)現(xiàn)文件瀏覽器下載方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05