vue 動態(tài)添加的路由頁面刷新時失效的原因及解決方案
問題描述
昨天在做vue后臺管理系統(tǒng)有關(guān)權(quán)限頁面動態(tài)添加到路由的功能時,遇到一個問題:動態(tài)添加的路由頁面,在頁面刷新時出現(xiàn)了404的情況。
場景
后臺管理系統(tǒng)的權(quán)限控制是通過在前端頁面定義權(quán)限code, 把code給后臺同學(xué)保存配置到表中,之后根據(jù)后臺返回的權(quán)限code列表與前端頁面配置的code菜單列表做篩選匹配,code相等的頁面就是有權(quán)限的頁面,再通過router.addRoute()動態(tài)添加到路由中,有權(quán)限的路由才可以被訪問,否則會提示無權(quán)限。
固定路由一開始就會放在new Router中,比如登錄頁面login
接口返回

前端菜單定義

vuex中的方法


出現(xiàn)的問題
登錄后,通過調(diào)用vuex中的方法,完成獲取權(quán)限code,動態(tài)篩選權(quán)限路由頁面操作,然后通過router.addRoute()將有權(quán)限菜單添加到路由中,進(jìn)入動態(tài)添加的路由頁面,刷新頁面出現(xiàn)404
原因分析
頁面刷新時,路由重新初始化,動態(tài)添加的路由此時已不存在,只有一些固定路由(比如登錄頁面)還在,所以出現(xiàn)了404的情況
解決方案
VUEX store中存儲的數(shù)據(jù)會在頁面刷新時清空。
在路由的全局導(dǎo)航router.beforeEach處做個判斷,根據(jù)VUEX中存放的list是否有值來判斷頁面是否是刷新,如果不為0,則是第一次登陸,登錄后會走匹配路由的方法,不會有問題;如果list.length為0,就為刷新頁面,需要重新執(zhí)行路由匹配,重新添加動態(tài)路由即可。
實現(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()
//頁面刷新后重新設(shè)置權(quán)限頁面動態(tài)路由,防止出現(xiàn)動態(tài)路由404問題
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)登錄 否 去登陸頁面
next({
path: '/login',
query: {
redirect: to.fullPath
}
})
} else { //已登錄用戶進(jìn)入頁面
if (to.path === '/login') {
next({ path: '/index' })
} else {
reSetPermissionList(to).then(data => {
data === 'permCode' ? next({ path: to.path, query: to.query }) : next()
})
}
}
})
總結(jié)
主要通過在全局導(dǎo)航處判斷VUEX中的數(shù)據(jù)是否存在,判斷頁面是否刷新,是的話重新走一遍權(quán)限路由匹配的方法。
以上就是vue動態(tài)添加的路由頁面刷新時失效的原因及解決方案的詳細(xì)內(nèi)容,更多關(guān)于vue 路由頁面刷新的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
vue3+ts+element-plus實際開發(fā)之統(tǒng)一調(diào)用彈窗封裝的詳細(xì)過程
這篇文章主要介紹了vue3+ts+element-plus實際開發(fā)之統(tǒng)一調(diào)用彈窗封裝的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-03-03
一文詳解VueUse中useAsyncState的實現(xiàn)原理
在Vue 3 Composition API中,我們可以使用自定義鉤子函數(shù)來封裝可復(fù)用的邏輯,useAsyncState是一個用于管理異步狀態(tài)的自定義鉤子函數(shù),本文將給大家介紹一下useAsyncState的實現(xiàn)原理,感興趣的朋友可以參考下2024-01-01
vue-router動態(tài)路由實現(xiàn)前端權(quán)限管理方式
這篇文章主要介紹了vue-router動態(tài)路由實現(xiàn)前端權(quán)限管理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10

