最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue 動(dòng)態(tài)添加的路由頁(yè)面刷新時(shí)失效的原因及解決方案

 更新時(shí)間:2021年02月26日 10:28:13   作者:暖風(fēng)吹過(guò)的季節(jié)  
這篇文章主要介紹了vue動(dòng)態(tài)添加的路由頁(yè)面刷新時(shí)失效的原因及解決方案,幫助大家更好的理解和學(xué)習(xí)使用vue,感興趣的朋友可以了解下

問(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實(shí)現(xiàn)在進(jìn)行增刪改操作后刷新頁(yè)面

    vue實(shí)現(xiàn)在進(jìn)行增刪改操作后刷新頁(yè)面

    這篇文章主要介紹了vue實(shí)現(xiàn)在進(jìn)行增刪改操作后刷新頁(yè)面,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-08-08
  • vue如何通過(guò)插槽組件之間數(shù)據(jù)傳遞

    vue如何通過(guò)插槽組件之間數(shù)據(jù)傳遞

    這篇文章主要介紹了vue如何通過(guò)插槽組件之間數(shù)據(jù)傳遞問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • Vue使用自定義指令實(shí)現(xiàn)拖拽行為實(shí)例分析

    Vue使用自定義指令實(shí)現(xiàn)拖拽行為實(shí)例分析

    這篇文章主要介紹了Vue使用自定義指令實(shí)現(xiàn)拖拽行為,結(jié)合實(shí)例形式分析了Vue使用自定義指令實(shí)現(xiàn)拖拽行為具體步驟、原理與操作注意事項(xiàng),需要的朋友可以參考下
    2020-06-06
  • vue3+ts+element-plus實(shí)際開(kāi)發(fā)之統(tǒng)一調(diào)用彈窗封裝的詳細(xì)過(guò)程

    vue3+ts+element-plus實(shí)際開(kāi)發(fā)之統(tǒng)一調(diào)用彈窗封裝的詳細(xì)過(guò)程

    這篇文章主要介紹了vue3+ts+element-plus實(shí)際開(kāi)發(fā)之統(tǒng)一調(diào)用彈窗封裝的詳細(xì)過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-03-03
  • 一文詳解VueUse中useAsyncState的實(shí)現(xiàn)原理

    一文詳解VueUse中useAsyncState的實(shí)現(xiàn)原理

    在Vue 3 Composition API中,我們可以使用自定義鉤子函數(shù)來(lái)封裝可復(fù)用的邏輯,useAsyncState是一個(gè)用于管理異步狀態(tài)的自定義鉤子函數(shù),本文將給大家介紹一下useAsyncState的實(shí)現(xiàn)原理,感興趣的朋友可以參考下
    2024-01-01
  • vue引入swiper插件的使用實(shí)例

    vue引入swiper插件的使用實(shí)例

    本篇文章主要介紹了vue引入swiper插件的使用實(shí)例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-07-07
  • vue 中使用print.js導(dǎo)出pdf操作

    vue 中使用print.js導(dǎo)出pdf操作

    這篇文章主要介紹了vue 中使用print.js導(dǎo)出pdf操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11
  • vue3 teleport的使用案例詳解

    vue3 teleport的使用案例詳解

    這篇文章主要介紹了vue3 teleport的使用demo,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • vue-router動(dòng)態(tài)路由實(shí)現(xiàn)前端權(quán)限管理方式

    vue-router動(dòng)態(tài)路由實(shí)現(xiàn)前端權(quán)限管理方式

    這篇文章主要介紹了vue-router動(dòng)態(tài)路由實(shí)現(xiàn)前端權(quán)限管理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Vue如何實(shí)現(xiàn)組件間通信

    Vue如何實(shí)現(xiàn)組件間通信

    組件間通信簡(jiǎn)單來(lái)說(shuō)就是組件間進(jìn)行數(shù)據(jù)傳遞。就像我們?nèi)粘5拇螂娫?,就是通訊的一種方式,你把話說(shuō)給我聽(tīng),我把話說(shuō)給你聽(tīng),說(shuō)的話就是數(shù)據(jù)。電話就是通訊方式的一種。無(wú)論是 Vue 還是 React ,都得進(jìn)行組件間通信。
    2021-05-05

最新評(píng)論

同德县| 苍南县| 黄山市| 丹巴县| 沅陵县| 兴业县| 红原县| 鹤峰县| 烟台市| 那曲县| 平安县| 阿合奇县| 商水县| 专栏| 舒兰市| 施秉县| 和静县| 武邑县| 寿阳县| 花垣县| 洪湖市| 铜川市| 保德县| 乌海市| 汉沽区| 军事| 洪洞县| 萍乡市| 雅安市| 陇西县| 咸阳市| 云梦县| 平定县| 宁武县| 宜良县| 师宗县| 杭州市| 基隆市| 安陆市| 公主岭市| 静宁县|