精品秘无码一区二区三区老师-精品秘一区二三区免费雷安-精品蜜桃秘一区二区三区-精品蜜桃秘一区二区三区粉嫩-精品蜜桃一区二区三区-精品蜜臀国产aⅴ一区二区三区

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

Vue 3 動(dòng)態(tài)路由與手動(dòng)導(dǎo)航實(shí)現(xiàn)

admin
2024年12月28日 19:55 本文熱度 228

在后臺(tái)管理系統(tǒng)中,前端的路由往往需要根據(jù)用戶的權(quán)限動(dòng)態(tài)生成。這篇文章將重點(diǎn)介紹如何在 Vue 3 中實(shí)現(xiàn)動(dòng)態(tài)路由注冊(cè)和手動(dòng)導(dǎo)航,確保用戶訪問(wèn)的頁(yè)面與權(quán)限對(duì)應(yīng)。

1. 動(dòng)態(tài)路由的需求與原理

為什么需要?jiǎng)討B(tài)路由?

  • 權(quán)限控制:不同用戶角色需要看到不同的菜單和頁(yè)面。
  • 后端驅(qū)動(dòng):后端返回菜單數(shù)據(jù),前端動(dòng)態(tài)渲染菜單和注冊(cè)路由。
  • 避免硬編碼:路由不再寫(xiě)死在前端代碼里,保證靈活性。
動(dòng)態(tài)路由的原理

  1. 靜態(tài)路由:定義公共頁(yè)面,如登錄頁(yè)和404頁(yè)面。
  2. 動(dòng)態(tài)路由:存儲(chǔ)需要通過(guò)后端數(shù)據(jù)動(dòng)態(tài)添加的頁(yè)面。
  3. 動(dòng)態(tài)注冊(cè)路由:根據(jù)后端返回的數(shù)據(jù),通過(guò)router.addRoute動(dòng)態(tài)添加到路由系統(tǒng)。
  4. 手動(dòng)導(dǎo)航:添加新路由后,需要手動(dòng)觸發(fā)導(dǎo)航保證路由生效。

2.靜態(tài)路由與動(dòng)態(tài)路由配置
靜態(tài)路由
靜態(tài)路由是所有用戶共享的基本路由,如登錄頁(yè)、404頁(yè)等。
    import { createRouter, createWebHashHistory, RouteRecordRaw } from 'vue-router';import Layout from '@/layout/admin.vue';
    const routesArray<RouteRecordRaw> = [  {    path'/',    componentLayout,    name'admin',  },  {    path'/login',    name'login',    component() => import('@/pages/login/index.vue'),    meta: { title'登錄頁(yè)' },  },  {    path'/:pathMatch(.*)*',    name'NotFound',    component() => import('@/pages/404/index.vue'),    meta: { title'404' },  },];
    動(dòng)態(tài)路由
    動(dòng)態(tài)路由需要根據(jù)后端返回的數(shù)據(jù)進(jìn)行注冊(cè):
      const asyncRoutes: Array<RouteRecordRaw> = [  {    path: '/',    name: '/',    component: () => import('@/pages/index/index.vue'),    meta: { title: '首頁(yè)' },  },  {    path: '/goods/list',    name: '/goods/list',    component: () => import('@/pages/goods/list.vue'),    meta: { title: '商品列表' },  },  {    path: '/category/list',    name: '/category/list',    component: () => import('@/pages/category/list.vue'),    meta: { title: '分類列表' },  },];
      3.addRoutes實(shí)現(xiàn)動(dòng)態(tài)路由注冊(cè)
      addRoutes方法
      該方法接收后端返回的菜單數(shù)組,并將匹配的動(dòng)態(tài)路由添加到主路由admin下。
        import { router } from '@/router/index';
        export const addRoutes = (routesArray: Array<MenusArray>) => {  let hasNewRoutes = false;
          const addRoutesFromMenus = (menus: Array<MenusArray>) => {    menus.forEach((menu) => {      // 查找匹配的動(dòng)態(tài)路由      const route = asyncRoutes.find((r) => r.path === menu.frontpath);      // 添加到router中      if (route && !router.hasRoute(route.path)) {        router.addRoute('admin', route);        hasNewRoutes = true;      }      // 遞歸處理子菜單      if (menu.child && menu.child.length > 0) {        addRoutesFromMenus(menu.child);      }    });  };
          addRoutesFromMenus(routesArray);  return hasNewRoutes;};
        解釋

        1. router.addRoute:VueRouter提供的API,可以動(dòng)態(tài)添加路由。
        2. 避免重復(fù)添加:router.hasRoute檢查路由是否已存在,防止重復(fù)注冊(cè)。
        3. 遞歸處理:支持多級(jí)菜單,遞歸遍歷child子菜單。

        4.路由守衛(wèi)中調(diào)用addRoutes
        在router.beforeEach路由守衛(wèi)中,調(diào)用addRoutes注冊(cè)動(dòng)態(tài)路由,并實(shí)現(xiàn)手動(dòng)導(dǎo)航。
          import { getToken } from '@/utils/auth';import store from '@/store';import { addRoutes } from '@/router/index';
          router.beforeEach(async (to, from, next) => {  const token = getToken();  let hasNewRoutes = false;
            // 顯示全局加載狀態(tài)  showFullLoading();
            // 未登錄跳轉(zhuǎn)到登錄頁(yè)  if (!token && to.name !== 'login' && to.name !== 'NotFound') {    return next('/login');  }
            // 已登錄訪問(wèn)登錄頁(yè),重定向到主頁(yè)  if (token && to.name === 'login') {    return next('/');  }
            // 已登錄狀態(tài)下,動(dòng)態(tài)添加路由  if (token) {    await store.dispatch('user/getUserInfo'); // 拉取用戶信息    hasNewRoutes = addRoutes(store.getters['menu/getMenus']); // 添加動(dòng)態(tài)路由  }
            // 設(shè)置頁(yè)面標(biāo)題  if (to.meta.title) {    document.title = `${to.meta.title}-測(cè)試后臺(tái)管理`;  } else {    document.title = '測(cè)試后臺(tái)管理';  }
            // 手動(dòng)導(dǎo)航:如果添加了新路由,重新跳轉(zhuǎn)當(dāng)前頁(yè)面  hasNewRoutes ? next(to.fullPath) : next();});
          手動(dòng)導(dǎo)航的必要性

            • router.addRoute是動(dòng)態(tài)操作,添加新路由后需要重新跳轉(zhuǎn)一次,確保用戶能正常訪問(wèn)新注冊(cè)的頁(yè)面。
            • next(to.fullPath):手動(dòng)跳轉(zhuǎn)到當(dāng)前頁(yè)面。

            5.完整流程

            1. 用戶登錄:獲取用戶 token,拉取用戶信息。
            2. 獲取菜單數(shù)據(jù):后端返回用戶權(quán)限對(duì)應(yīng)的菜單數(shù)據(jù)。
            3. 動(dòng)態(tài)注冊(cè)路由:調(diào)用 addRoutes 將菜單數(shù)據(jù)匹配的路由添加到 admin 下。
            4. 手動(dòng)導(dǎo)航:動(dòng)態(tài)路由添加完成后,使用 next(to.fullPath) 手動(dòng)觸發(fā)頁(yè)面跳轉(zhuǎn)。
            5. 權(quán)限生效:用戶只能訪問(wèn)與自己權(quán)限匹配的頁(yè)面。

            6.總結(jié)

            • 靜態(tài)路由:用于公共頁(yè)面。
            • 動(dòng)態(tài)路由:后端驅(qū)動(dòng),通過(guò) addRoutes 動(dòng)態(tài)注冊(cè)。
            • 手動(dòng)導(dǎo)航:解決動(dòng)態(tài)添加路由后無(wú)法直接訪問(wèn)的問(wèn)題。
            • 靈活:動(dòng)態(tài)路由使前端代碼更靈活,后端控制權(quán)限更方便。


            閱讀原文:原文鏈接


            該文章在 2024/12/30 16:01:11 編輯過(guò)
            關(guān)鍵字查詢
            相關(guān)文章
            正在查詢...
            點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
            點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
            點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
            點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
            Copyright 2010-2025 ClickSun All Rights Reserved

            主站蜘蛛池模板: 精品亚洲国产成人A片APP | 亚洲精品无码久久久久中文字幕 | 亚洲偷自拍另类图片综合社区 | 国产露脸无码A区久久蘑菇 国产乱xxⅹxx国语对白 | 国产男男作爱在线观看 | 国产熟女aa级毛片www古代片 | 另类小说色综合网站 | 综合图区亚洲欧美另类图片 | 精品国产乱子伦在线观看 | 国产成人久久精品二三区无码 | 国产麻豆日韩欧美久 | 亚洲精华液一二三产区 | 日韩人妻无码一区二区三区综合部 | 无码免费一区二区三区在线 | 国产色精品vr一区二区 | 亚洲久久无码中文字幕 | 人妻丰满熟妇av无码区hd | 日韩免费一级毛片 | 性一交一无一伦一精一品 | 囯产免费一区二区三区在线播放 | 日韩焦点影视 | 无码尹人久久相蕉无码 | 精品国产天堂综合一区在线 | 亚洲无av在线中文字幕 | 制服丝袜日韩一区二区三区 | 人与动人物 | 日韩国产欧美亚洲v片 | 国精产品999一区二区三区有限 | 精品国产欧美一区二区最新 | 亚洲午夜精品A片久久不卡蜜桃 | XX性欧美肥妇精品久久久久久 | 国产精品自在在线午夜蜜芽tv在线 | 亚洲电影激情五月激情 | 亚洲欧美不卡视频在线播放 | 亚洲蜜桃mv在线播放 | 亚洲国产精品一区第二页 | 国产网爆门视频在线播放 | 久久久久久国产一区二区三区 | 涩涩亚洲乱码精品 | 亚洲国产区男人 | 亚洲中文无码一级片 |