欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

vue實(shí)現(xiàn)動(dòng)態(tài)路由的詳細(xì)代碼示例

 更新時(shí)間:2024年01月25日 15:41:03   作者:前端~  
動(dòng)態(tài)路由,動(dòng)態(tài)即不是寫死的,是可變的,下面這篇文章主要給大家介紹了關(guān)于vue實(shí)現(xiàn)動(dòng)態(tài)路由的詳細(xì)代碼示例,文中通過(guò)圖文以及代碼介紹的非常詳細(xì),需要的朋友可以參考下

vue-router對(duì)象中的addRoutes,用它來(lái)動(dòng)態(tài)添加路由配置

格式:

router.addRoutes([路由配置對(duì)象])
this.$router.addRoutes([路由配置對(duì)象])

舉個(gè)例子:

// 按鈕
<button @click="hAddRoute">addRoute</button>

// 回調(diào)
hAddRoute() {
    this.$router.addRoutes([{
        path: '/abc',
        component: () => import('@/views/abc'),
        }])
},

我是以 vue-admin-template 為例,做如下演示:

在router/index.js中的路由配置中 只保留靜態(tài)路由(因?yàn)槲覀円獎(jiǎng)討B(tài)的添加))

const createRouter = () => new Router({
  // mode: 'history', // require service support
  scrollBehavior: () => ({ y: 0 }),
  routes: [...constantRoutes]   //因?yàn)橐獎(jiǎng)討B(tài)添加動(dòng)態(tài)路由,所以這里只寫靜態(tài)路由
})

在permission.js中引入,并使用addRoutes動(dòng)態(tài)添加

這個(gè)是 router 下的 index.js中定義的 靜態(tài)路由、動(dòng)態(tài)路由

接下來(lái)來(lái)看 在permission.js中引入的內(nèi)容,

// 引入所有的動(dòng)態(tài)路由表(未經(jīng)過(guò)篩選)
+ import router, { asyncRoutes } from '@/router'

const whiteList = ['/login', '/404']
router.beforeEach(async(to, from, next) => {
  // 開啟進(jìn)度條
  NProgress.start()
  // 獲取本地token 全局getter
  const token = store.getters.token
  if (token) {
    // 有token
    if (to.path === '/login') {
      next('/')
    } else {
      if (!store.getters.userId) {
        await store.dispatch('user/getUserInfo')
        // 改寫成動(dòng)態(tài)添加的方式
+       router.addRoutes(asyncRoutes)
      }
      next()
    }
  } else {
    // 沒(méi)有token
    if (whiteList.includes(to.path)) {
      next()
    } else {
      next('/login')
    }
  }
  // 結(jié)束進(jìn)度條
  NProgress.done()
})

如果我們希望在調(diào)用addRoutes方法之后,要路由數(shù)據(jù)立刻反映到菜單中,我們需要想一個(gè)額外的方法,思考一下,vue開發(fā)中,哪個(gè)技術(shù)可以保證響應(yīng)式特性還可以動(dòng)態(tài)修改? vuex!

補(bǔ)充模塊,在src/store/modules下補(bǔ)充menu.js模塊 (定義vuex管理菜單數(shù)據(jù))

import { constantRoutes } from '@/router' 
export default {
  namespaced: true,
  // 公共數(shù)據(jù)
  state: {
    // 本地取一下token
    menuList: [] // 所有可以訪問(wèn)的路由配置
  },
  mutations: {
    setMenuList(state, asyncRoutes) { 
      console.log('asyncRoutes', asyncRoutes) //第二個(gè)參數(shù)是調(diào)用mutatains時(shí)傳過(guò)來(lái)的動(dòng)態(tài)路由參數(shù)
      state.menuList = [...constantRoutes, ...asyncRoutes]
    }
  }
}

當(dāng)然,要在 src/store/index.js 中注冊(cè)這個(gè)模塊

修改src/permission.js中的代碼

if (!store.getters.userId) {
        await store.dispatch('user/getUserInfo')

        // 動(dòng)態(tài)添加可以訪問(wèn)的路由設(shè)置
        router.addRoutes(asyncRoutes)

        // 根據(jù)用戶實(shí)際能訪問(wèn)幾個(gè)頁(yè)面來(lái)決定從整體8個(gè)路由設(shè)置
        // 中,過(guò)濾中出來(lái)幾個(gè),然后保存到vuex中
    ++   store.commit('menu/setMenuList', asyncRoutes)  //把動(dòng)態(tài)路由存入vuex中
      }

在src\layout\components\Sidebar\index.vue文件中,修改

routes() {
  // 拿到的是一個(gè)完整的包含了靜態(tài)路由和動(dòng)態(tài)路由的數(shù)據(jù)結(jié)構(gòu)
  return this.$store.state.menu.menuList
}

上一步我們實(shí)現(xiàn)了: 1.把動(dòng)態(tài)路由通過(guò)addRoutes動(dòng)態(tài)添加到了路由系統(tǒng)里, 2. 把動(dòng)態(tài)路由保存到vuex的menu中,

但是我們沒(méi)有和權(quán)限數(shù)據(jù)做搭配,接下來(lái)我們通過(guò)接口返回的權(quán)限數(shù)據(jù)對(duì)動(dòng)態(tài)菜單做過(guò)濾處理,以確定完成菜單與用戶權(quán)限相關(guān)。

接下來(lái)就是 調(diào)接口,后端返給你菜單數(shù)據(jù):

用戶能訪問(wèn)哪些頁(yè)面是通過(guò)actions獲取到的,只需要從action中返回即可

在permission.js中獲取action的返回值并過(guò)濾

if (!store.getters.userId) {
        // 有token,要去的不是login,就直接放行
        // 進(jìn)一步獲取用戶信息
        // 發(fā)ajax---派發(fā)action來(lái)做
        const menus = await store.dispatch('user/getUserInfo')
        console.log('當(dāng)前用戶能訪問(wèn)的頁(yè)面', menus)
        console.log('當(dāng)前系統(tǒng)功能中提供的所有的動(dòng)態(tài)路由頁(yè)面是', asyncRoutes)
        // 根據(jù)本用戶實(shí)際的權(quán)限menus去 asyncRoutes 中做過(guò)濾,選出本用戶能訪問(wèn)的頁(yè)面

        const filterRoutes = asyncRoutes.filter(route => {
          const routeName = route.children[0].name
          return menus.includes(routeName)
        })

        // 一定要在進(jìn)入主頁(yè)之前去獲取用戶信息

        // addRoutes用來(lái)動(dòng)態(tài)添加路由配置
        // 只有在這里設(shè)置了補(bǔ)充了路由配置,才可能去訪問(wèn)頁(yè)面
        // 它們不會(huì)出現(xiàn)左側(cè)
        router.addRoutes(filterRoutes)

        // 把它們保存在vuex中,在src\layout\components\Sidebar\index.vue
        // 生成左側(cè)菜單時(shí),也應(yīng)該去vuex中拿
        store.commit('menu/setMenuList', filterRoutes)
      }

問(wèn)題

如果我們刷新瀏覽器,會(huì)發(fā)現(xiàn)跳到了404頁(yè)面

對(duì)于addRoute添加的路由,在刷新時(shí)會(huì)白屏

原因

現(xiàn)在我們的路由設(shè)置中的404頁(yè)處在中間位置而不是所有路由的末尾了。

解決

把404頁(yè)改到路由配置的最末尾就可以了

 filterRoutes.push({ path: '*', redirect: '/404', hidden: true }) 
//解決刷新去404頁(yè)面
 // 解決刷新出現(xiàn)的白屏bug
  next({
    ...to, // next({ ...to })的目的,是保證路由添加完了再進(jìn)入頁(yè)面 (可以理解為重進(jìn)一次)
    replace: true // 重進(jìn)一次, 不保留重復(fù)歷史
  })

效果如下:

總結(jié) 

到此這篇關(guān)于vue實(shí)現(xiàn)動(dòng)態(tài)路由的文章就介紹到這了,更多相關(guān)vue實(shí)現(xiàn)動(dòng)態(tài)路由內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于vuex的數(shù)據(jù)持久化處理方式

    關(guān)于vuex的數(shù)據(jù)持久化處理方式

    這篇文章主要介紹了關(guān)于vuex的數(shù)據(jù)持久化處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • Vue.js中computed的基本使用方法

    Vue.js中computed的基本使用方法

    Vue.js中,computed屬性根據(jù)依賴進(jìn)行緩存,只有依賴改變時(shí)才重新計(jì)算,這樣有效提高性能,computed屬性是響應(yīng)式的,可以自動(dòng)更新,并且默認(rèn)是只讀的,它與methods的主要區(qū)別在于計(jì)算屬性具有緩存性,而方法每次調(diào)用都會(huì)執(zhí)行,使用computed可以使模板更加簡(jiǎn)潔,提高應(yīng)用性能
    2024-09-09
  • vue項(xiàng)目出現(xiàn)ERESOLVE could not resolve問(wèn)題及解決

    vue項(xiàng)目出現(xiàn)ERESOLVE could not resolve問(wèn)題及解決

    這篇文章主要介紹了vue項(xiàng)目出現(xiàn)ERESOLVE could not resolve問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-10-10
  • vue3.2中的vuex使用詳解

    vue3.2中的vuex使用詳解

    這篇文章主要介紹了vue3.2中的vuex使用詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • vue自定義組件@click點(diǎn)擊失效問(wèn)題及解決

    vue自定義組件@click點(diǎn)擊失效問(wèn)題及解決

    這篇文章主要介紹了vue自定義組件@click點(diǎn)擊失效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue3實(shí)現(xiàn)跑馬燈效果

    Vue3實(shí)現(xiàn)跑馬燈效果

    這篇文章主要為大家詳細(xì)介紹了Vue3實(shí)現(xiàn)跑馬燈效果,可以更換顏色,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • Vue中組件的傳值方式詳解

    Vue中組件的傳值方式詳解

    這篇文章主要介紹了Vue中組件的傳值方式詳解,Vue中最常見的組件之間的通信方式有12種,今天我們會(huì)詳細(xì)講解父?jìng)髯觩rops方式和子傳父emit以及非父子組件傳值,需要的朋友可以參考下
    2023-08-08
  • Vue向下滾動(dòng)加載更多數(shù)據(jù)scroll案例詳解

    Vue向下滾動(dòng)加載更多數(shù)據(jù)scroll案例詳解

    這篇文章主要介紹了Vue向下滾動(dòng)加載更多數(shù)據(jù)scroll案例詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • 簡(jiǎn)單理解Vue中的nextTick方法

    簡(jiǎn)單理解Vue中的nextTick方法

    本篇文章主要介紹了簡(jiǎn)單理解Vue中的nextTick方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Vue利用AJAX請(qǐng)求獲取XML文件數(shù)據(jù)的操作方法

    Vue利用AJAX請(qǐng)求獲取XML文件數(shù)據(jù)的操作方法

    在現(xiàn)代Web開發(fā)中,從前端框架到后端API的交互是必不可少的一部分,Vue.js作為一個(gè)輕量級(jí)且功能強(qiáng)大的前端框架,支持多種方式與服務(wù)器通信,從而獲取或發(fā)送數(shù)據(jù),本文將詳細(xì)介紹如何在Vue.js項(xiàng)目中使用AJAX請(qǐng)求來(lái)獲取XML格式的數(shù)據(jù),需要的朋友可以參考下
    2024-09-09

最新評(píng)論