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

vue實現(xiàn)動態(tài)路由的詳細代碼示例

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

vue-router對象中的addRoutes,用它來動態(tài)添加路由配置

格式:

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

舉個例子:

// 按鈕
<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)路由(因為我們要動態(tài)的添加))

const createRouter = () => new Router({
  // mode: 'history', // require service support
  scrollBehavior: () => ({ y: 0 }),
  routes: [...constantRoutes]   //因為要動態(tài)添加動態(tài)路由,所以這里只寫靜態(tài)路由
})

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

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

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

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

const whiteList = ['/login', '/404']
router.beforeEach(async(to, from, next) => {
  // 開啟進度條
  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')
        // 改寫成動態(tài)添加的方式
+       router.addRoutes(asyncRoutes)
      }
      next()
    }
  } else {
    // 沒有token
    if (whiteList.includes(to.path)) {
      next()
    } else {
      next('/login')
    }
  }
  // 結(jié)束進度條
  NProgress.done()
})

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

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

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

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

修改src/permission.js中的代碼

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

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

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

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

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

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

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

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

用戶能訪問哪些頁面是通過actions獲取到的,只需要從action中返回即可

在permission.js中獲取action的返回值并過濾

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

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

        // 一定要在進入主頁之前去獲取用戶信息

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

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

問題

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

對于addRoute添加的路由,在刷新時會白屏

原因

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

解決

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

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

效果如下:

總結(jié) 

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

相關(guān)文章

  • vue.js集成echarts時遇到的一些問題總結(jié)

    vue.js集成echarts時遇到的一些問題總結(jié)

    這篇文章主要給大家總結(jié)介紹了關(guān)于vue.js集成echarts遇到的一些問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Uniapp圖片上傳的兩種實現(xiàn)方式詳解

    Uniapp圖片上傳的兩種實現(xiàn)方式詳解

    UniApp是一個跨平臺的前端框架,它允許開發(fā)者使用一套代碼構(gòu)建同時運行在微信小程序、H5、iOS、Android等多個平臺的應(yīng)用,在UniApp中,上傳圖片通常涉及到使用其提供的File?API或者第三方插件來進行操作,所以本文給大家介紹了Uniapp圖片上傳的兩種實現(xiàn)方式
    2025-10-10
  • Vue如何實現(xiàn)分頁功能代碼實例

    Vue如何實現(xiàn)分頁功能代碼實例

    這篇文章主要給大家介紹了關(guān)于Vue如何實現(xiàn)分頁功能的相關(guān)資料,Vue分頁功能的實現(xiàn)需要前端和后端共同配合完成,文中通過代碼實例介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • Css中該如何使用Vue的變量

    Css中該如何使用Vue的變量

    在我們使用Vue開發(fā)時,經(jīng)常會用到CSS,下面這篇文章主要給大家介紹了關(guān)于Css中該如何使用Vue變量的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11
  • vue實現(xiàn)pdf導(dǎo)出解決生成canvas模糊等問題(推薦)

    vue實現(xiàn)pdf導(dǎo)出解決生成canvas模糊等問題(推薦)

    最近公司項目需要,利用vue實現(xiàn)pdf導(dǎo)出,從而保存到本地打印出來,說起來好像也很容易,具體要怎么實現(xiàn)呢?下面小編給大家?guī)砹藇ue實現(xiàn)pdf導(dǎo)出解決生成canvas模糊等問題,需要的朋友參考下吧
    2018-10-10
  • vue.js通過自定義指令實現(xiàn)數(shù)據(jù)拉取更新的實現(xiàn)方法

    vue.js通過自定義指令實現(xiàn)數(shù)據(jù)拉取更新的實現(xiàn)方法

    數(shù)據(jù)拉取更新這個功能相信大家基本都見過,但是如果要做起來卻不止如何做起,所以這篇文章給大家分享了vue.js通過自定義指令實現(xiàn)的方法,閱讀本文需要對vue有一定理解,有需要的朋友們下面來一起看看吧。
    2016-10-10
  • vue3項目如何國際化實戰(zhàn)指南

    vue3項目如何國際化實戰(zhàn)指南

    像很多大型的網(wǎng)址,特別是跨國際等公司網(wǎng)頁,訪問來自世界各地用戶,所以網(wǎng)頁的國際化極其重要的需求,下面這篇文章主要給大家介紹了關(guān)于vue3項目如何國際化的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • vue select 獲取value和lable操作

    vue select 獲取value和lable操作

    這篇文章主要介紹了vue select 獲取value和lable操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • vue中Axios的封裝和API接口的管理示例詳解

    vue中Axios的封裝和API接口的管理示例詳解

    這篇文章主要介紹了vue中Axios的封裝和API接口的管理,主要目的就是在幫助我們簡化代碼和利于后期的更新維護,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-09-09
  • 詳解vue配置請求多個服務(wù)端解決方案

    詳解vue配置請求多個服務(wù)端解決方案

    這篇文章主要介紹了詳解vue配置請求多個服務(wù)端解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論

乌审旗| 满城县| 邵武市| 勃利县| 卓尼县| 垫江县| 东台市| 叶城县| 仁化县| 香河县| 柳江县| 历史| 柯坪县| 永丰县| 武山县| 宜宾市| 扎兰屯市| 汨罗市| 房山区| 丰镇市| 财经| 淮北市| 宁波市| 吉隆县| 东乌| 象山县| 泰顺县| 巴青县| 乌鲁木齐县| 罗平县| 庄浪县| 荣昌县| 东山县| 共和县| 凤冈县| 获嘉县| 睢宁县| 红桥区| 扶绥县| 修武县| 墨竹工卡县|