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

vue3實(shí)現(xiàn)動(dòng)態(tài)路由及菜單

 更新時(shí)間:2024年03月04日 16:22:52   作者:左直拳  
這篇文章主要介紹了vue3實(shí)現(xiàn)動(dòng)態(tài)路由及菜單,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

一般來(lái)說(shuō),前端項(xiàng)目中的路由,很有可能是需要?jiǎng)討B(tài)注冊(cè)的。

因?yàn)椴藛慰赡茉诠芾硐到y(tǒng)中維護(hù),還跟權(quán)限綁定,用戶登錄以后,需要?jiǎng)討B(tài)展示菜單。

菜單往往跟路由掛鉤,因此,路由需要?jiǎng)討B(tài)注冊(cè)。

具體如何實(shí)現(xiàn)呢?

思路是,系統(tǒng)只提供默認(rèn)的路由,登錄以后,讀入菜單/路由數(shù)據(jù),加載。

這其中,可能會(huì)出現(xiàn)默認(rèn)路由與動(dòng)態(tài)路由有重疊的情況。

處理辦法是覆蓋。數(shù)據(jù)結(jié)構(gòu)方面,菜單與路由數(shù)據(jù)二合一。

一、項(xiàng)目結(jié)構(gòu)

這是我們一個(gè)項(xiàng)目的公共框架的代碼結(jié)構(gòu)。

我們打算在src/modules/存放具體業(yè)務(wù)系統(tǒng)的代碼,而外部是相對(duì)穩(wěn)定,可以復(fù)用的框架代碼。

二、默認(rèn)路由

src/router/default.js,內(nèi)容比較少,只有登錄、首頁(yè)、404三個(gè)。其余全都靠動(dòng)態(tài)注冊(cè)。

路由項(xiàng)中,自定義屬性放在meta里。動(dòng)態(tài)路由與默認(rèn)路由的數(shù)據(jù)結(jié)構(gòu)一致。

/**
 * 默認(rèn)路由
 * 具體業(yè)務(wù)路由,應(yīng)在src/modules/router里定義,或者從后端動(dòng)態(tài)加載
 */
export default [
  /**
   * 路由項(xiàng)結(jié)構(gòu):
   *{
      path: "/",//路徑,(必選;path、name、component是路由規(guī)定必選的元素)
                  也可以帶參數(shù),如 path: "/resource/detail/:id",
      name: "路由名稱,是路由唯一標(biāo)識(shí)",(必選)
      component: 指向組件,如 Home,或者() => import("../views/login/PageIndex.vue"),(必選)
      meta: {//meta里的屬性可以自定義,全部為可選項(xiàng)
        text: "名稱",//展示在菜單里,(可選)
        navi: true, //導(dǎo)航條(一級(jí)菜單),(可選)
        noLogin: true, //無(wú)須登錄即可瀏覽,(可選)
        access: "work:sysmanage,work:resourcemanage",//權(quán)限標(biāo)識(shí),(可選)
      },
      children: [],
    },
   */
  {
    path: "/login",
    name: "login",
    component: () => import("../views/login/PageIndex.vue"),
    meta: {
      noLogin: true, //無(wú)須登錄即可瀏覽
    },
  },
  {
    path: "/",
    name: "Home",
    component: () => import("../views/PageIndex.vue"),
  },
  {
    path: "/notAllow",
    name: "notAllow",
    component: () => import("../views/sys/notAllow.vue"),
  },
];

export const HomeName = "Home";

三、動(dòng)態(tài)注冊(cè)

注冊(cè)的時(shí)機(jī)是什么?在哪里注冊(cè)?怎么注冊(cè)?

答曰:登錄之后注冊(cè);在路由守衛(wèi)里注冊(cè);用router.addRoute()一個(gè)個(gè)加進(jìn)去。

1、登錄之后進(jìn)行注冊(cè),在路由衛(wèi)士里注冊(cè)

所謂路由守衛(wèi),就是路由規(guī)則。這名字我是從網(wǎng)上抄過(guò)來(lái)的。

src/router/index.js

import { createRouter, createWebHashHistory } from "vue-router";
import routes from "./default";
import routeAssembler from "./setup";
import { hasAuthority } from "@/utils/login.js";

const router = createRouter({
  history: createWebHashHistory(),
  routes,
});

// 路由守衛(wèi)
let registerRouteFresh = true;//是否還沒(méi)有動(dòng)態(tài)加載過(guò)
router.beforeEach((to, from, next) => {
  const isLogin = localStorage.isLogin ? true : false;
  if (isLogin) {
    //已登錄情況下驗(yàn)證權(quán)限
    let isAccess = hasAuthority(to.meta.access);
    if (!isAccess) {//沒(méi)有權(quán)限
      next("/notAllow");
      return;
    }
    if (registerRouteFresh) {//還沒(méi)有動(dòng)態(tài)加載過(guò)
      //動(dòng)態(tài)注冊(cè)路由 <----------------------------------------
      routeAssembler(router);
      registerRouteFresh = false;
      next({ ...to, replace: true });
    } else {
      //已經(jīng)登錄了,不能再打開(kāi)登錄頁(yè)
      to.path === "/login" ? next("home") : next();
    }
  } else {
    //如果無(wú)須登錄則直接打開(kāi),否則轉(zhuǎn)向登錄頁(yè)面
    to.meta.noLogin || to.path === "/login" ? next() : next("/login");
  }
});

export default router;

2、如何動(dòng)態(tài)注冊(cè)

src/router/setup.js,即上面例子中的routeAssembler:

/*
  裝配路由及菜單
 */
import fixItems from "./default"; //默認(rèn)路由
import { HomeName } from "./default"; //統(tǒng)一命名首頁(yè)路由項(xiàng)(參考前面的默認(rèn)路由)
import projectItems from "@/modules/router"; //具體業(yè)務(wù)系統(tǒng)的路由

export default (router) => {
  //獲得動(dòng)態(tài)路由
  const dynaItems = getDynamicItems();

  //對(duì)齊首頁(yè)(統(tǒng)一命名首頁(yè))
  adpatHome(HomeName, dynaItems);

  //添加動(dòng)態(tài)路由
  dynaItems.forEach((value) => {
    router.addRoute(value);
  });
};

const getDynamicItems = () => {
  /*
    獲取動(dòng)態(tài)路由,從指定文件加載或從后端獲取
  */
  return projectItems;
};

//默認(rèn)路由與業(yè)務(wù)路由對(duì)齊首頁(yè)的路由信息
//所謂對(duì)齊,就是大家的name保持一致,這樣才能保證動(dòng)態(tài)加入的路由項(xiàng),覆蓋掉前面的path和name相同的路由
const adpatHome = (HomeName, dynaItems) => {
  let home = dynaItems.filter((item) => {
    return item.path === "/";
  });
  if (home.length > 0 && home[0].name !== HomeName) {
    /**
     * 如果業(yè)務(wù)路由定義了首頁(yè),但其name與默認(rèn)路由首頁(yè)的name不相同
     * 則將業(yè)務(wù)路由中首頁(yè)項(xiàng)的name置為默認(rèn)名稱
     * 因?yàn)榘凑誺ue-router的規(guī)則,addRoute的時(shí)候,如果存在同名同路徑的路由項(xiàng),則覆蓋之
     * 我們要的就是覆蓋默認(rèn),以業(yè)務(wù)路由設(shè)置為準(zhǔn)
     */
    home[0].name = HomeName;
  }
};

這里面有個(gè)如果動(dòng)態(tài)路由,與默認(rèn)路由中存在相同的路由項(xiàng),該如何處理的問(wèn)題。

按照vue3的router規(guī)則,如果后面加進(jìn)來(lái)的路由項(xiàng),僅僅是path相同,而name不同,則不算是相同的路由項(xiàng),addRoute()進(jìn)去之后,仍然是原先的路由項(xiàng)起作用;但如果是path和name都相同,則原先的會(huì)被覆蓋(我懷疑是name相同就會(huì)被覆蓋)。

所以,默認(rèn)路由中有首頁(yè)路由,指向框架代碼中的默認(rèn)首頁(yè);加載動(dòng)態(tài)路由后,該路由被覆蓋,指向了具體業(yè)務(wù)系統(tǒng)的首頁(yè)。這也表明,我們無(wú)須自己手動(dòng)刪除已加載的同名路由項(xiàng)。

事實(shí)上,刪除還會(huì)報(bào)錯(cuò)。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue中Props與Attrs的實(shí)現(xiàn)實(shí)例

    vue中Props與Attrs的實(shí)現(xiàn)實(shí)例

    本文主要介紹了vue中Props與Attrs的實(shí)現(xiàn)實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-09-09
  • vue+jsplumb實(shí)現(xiàn)工作流程圖的項(xiàng)目實(shí)踐

    vue+jsplumb實(shí)現(xiàn)工作流程圖的項(xiàng)目實(shí)踐

    本文主要介紹了vue+jsplumb實(shí)現(xiàn)工作流程圖的項(xiàng)目實(shí)踐,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Vue.js計(jì)算機(jī)屬性computed和methods方法詳解

    Vue.js計(jì)算機(jī)屬性computed和methods方法詳解

    這篇文章主要為大家詳細(xì)介紹了Vue.js計(jì)算機(jī)屬性computed和methods方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Vue切換div顯示隱藏,多選,單選代碼解析

    Vue切換div顯示隱藏,多選,單選代碼解析

    這篇文章主要介紹了Vue切換div顯示隱藏,多選,單選代碼解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • vue、uniapp實(shí)現(xiàn)組件動(dòng)態(tài)切換效果

    vue、uniapp實(shí)現(xiàn)組件動(dòng)態(tài)切換效果

    在Vue中,通過(guò)使用動(dòng)態(tài)組件,我們可以實(shí)現(xiàn)組件的動(dòng)態(tài)切換,從而達(dá)到頁(yè)面的動(dòng)態(tài)展示效果,這篇文章主要介紹了vue、uniapp實(shí)現(xiàn)組件動(dòng)態(tài)切換,需要的朋友可以參考下
    2023-10-10
  • 解決iview打包時(shí)UglifyJs報(bào)錯(cuò)的問(wèn)題

    解決iview打包時(shí)UglifyJs報(bào)錯(cuò)的問(wèn)題

    下面小編就為大家分享一篇解決iview打包時(shí)UglifyJs報(bào)錯(cuò)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • JointJS流程圖的繪制方法

    JointJS流程圖的繪制方法

    這篇文章主要為大家介紹了JointJS流程圖的繪制方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • 解決vue項(xiàng)目 build之后資源文件找不到的問(wèn)題

    解決vue項(xiàng)目 build之后資源文件找不到的問(wèn)題

    這篇文章主要介紹了解決vue項(xiàng)目 build之后資源文件找不到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • Vue組件全局注冊(cè)實(shí)現(xiàn)警告框的實(shí)例詳解

    Vue組件全局注冊(cè)實(shí)現(xiàn)警告框的實(shí)例詳解

    這篇文章主要介紹了Vue組件全局注冊(cè)實(shí)現(xiàn)警告框的實(shí)例,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-06-06
  • vue3動(dòng)態(tài)路由解決刷新頁(yè)面空白或跳轉(zhuǎn)404問(wèn)題

    vue3動(dòng)態(tài)路由解決刷新頁(yè)面空白或跳轉(zhuǎn)404問(wèn)題

    這篇文章主要為大家詳細(xì)介紹了vue3如何通過(guò)動(dòng)態(tài)路由解決刷新頁(yè)面空白或跳轉(zhuǎn)404問(wèn)題,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2025-01-01

最新評(píng)論

大庆市| 德州市| 泰宁县| 利辛县| 宁乡县| 新乡市| 桐庐县| 东莞市| 女性| 静安区| 建瓯市| 山丹县| 栾川县| 昭通市| 盖州市| 密云县| 宁河县| 临洮县| 加查县| 长治县| 夏河县| 杭锦旗| 基隆市| 山西省| 徐州市| 陇西县| 桃江县| 玉林市| 永平县| 岫岩| 炎陵县| 南皮县| 会东县| 安溪县| 甘德县| 昭苏县| 西和县| 定远县| 会泽县| 隆安县| 舒城县|