vue 如何做一個動態的 BreadCrumb 組件,el-breadcrumb ElementUI

vue 如何做一個動態的 BreadCrumb 組件 el-breadcrumb ElementUI

在這里插入圖片描述

一、ElementUI 中的 BreadCrumb 定義

elementUI 中的 Breadcrumb 組件是這樣定義的

<template><el-breadcrumb separator="/"><el-breadcrumb-item :to="{ path: '/' }">主頁</el-breadcrumb-item><el-breadcrumb-item>系統配置</el-breadcrumb-item><el-breadcrumb-item>基礎配置</el-breadcrumb-item><el-breadcrumb-item>自動登錄</el-breadcrumb-item></el-breadcrumb>
</template>

效果如圖:
在這里插入圖片描述

二、實現原理

我們需要實現的是,讓它自己通過路由去填寫這部分內容
原理是根據當前路由值,拆分成多個段,然后通過路由 path 去匹配對應的路由名稱,再填入到上面的內容中即可。

比如:

1. 當前的路由值是 /system/normal-setup/auto-login

2. 通過拆分 / 生成一個數組

在這里插入圖片描述

3. 依次匹配對應的路由名稱

得到這個數組之后,依次去路由列表中匹配對應的路由名稱

  • /system 系統配置
  • /system/normal-setup 基礎配置
  • /system/normal-setup/auto-login 自動登錄

4. 結果

這樣就得到了一個 breadCrumb 數組,直接遍歷這個數組,顯示 BreadCrumb 即可

三、具體實現過程

知道了上面的實現原理,才會有具體的實現過程,這個過程還是有點麻煩的。

1. 處理路由數據

項目中用到的路由數據是這樣的樹形結構,路由數據的定義是這樣的,里面的 children 可以嵌套任意層:

interface MenuEntity {id?: number | null,parent_id: number,name: string,icon?: string,type: EnumMenuType, // 1->目錄 2->菜單 3->按鈕 4->外鏈path: string,component?: string,visible: EnumMenuVisible, // 1->可見 2->隱藏 默認為1redirect: string,sort: number, // 默認為 20perm: string, // permissioncreated_at?: string,updated_at?: string,children?: MenuEntity[]
}

實際的數據是這樣的:

{"name": "系統配置","id": 10,"parent_id": -1,"type": 1,"path": "/system","component": "","visible": 1,"redirect": "","perm": "","sort": 100,"icon": "Setting","created_at": "2024-02-26T14:55:12+08:00","updated_at": "2024-02-26T16:12:34+08:00","children": [{"name": "基礎配置","id": 12,"parent_id": -1,"type": 1,"path": "/system/normal-setup","component": "","visible": 1,"redirect": "","perm": "","sort": 10,"icon": "CreditCard","created_at": "2024-02-26T15:20:15+08:00","updated_at": "2024-02-26T16:11:56+08:00","children": [{"name": "自動登錄","id": 13,"parent_id": 12,"type": 2,"path": "/system/normal-setup/auto-login","component": "System/NormalSetup/AutoLoginSetup.vue","visible": 1,"redirect": "","perm": "","sort": 30,"icon": "User","created_at": "2024-02-26T15:24:18+08:00","updated_at": "2024-05-17T14:11:52+08:00","children": []},{"name": "系統更新","id": 28,"parent_id": 12,"type": 2,"path": "/system/normal-setup/system-update","component": "System/SystemUpdate.vue","visible": 1,"redirect": "","perm": "","sort": 50,"icon": "UploadFilled","created_at": "2024-02-26T16:19:49+08:00","updated_at": "2024-05-17T14:11:39+08:00","children": []},{"name": "申請廠家技術支持","id": 29,"parent_id": 12,"type": 2,"path": "/system/normal-setup/factory-help","component": "User/Space.vue","visible": 1,"redirect": "","perm": "","sort": 40,"icon": "SuitcaseLine","created_at": "2024-02-26T16:20:11+08:00","updated_at": "2024-03-27T09:04:20+08:00","children": []}]}]
}

為了好后續匹配 path 到路由名,需要將這個數據平化成一個數組,并構建一個 Map<path, RouteItem> 這樣的一個 Map 數據,目的是當執行下面操作時,取到對應的路由數據

flatMenuPathNameMap.get('/system')// 最終取到這樣的數據
{"name": "系統配置","id": 10,"parent_id": -1,"type": 1,"path": "/system","component": "","visible": 1,"redirect": "","perm": "","sort": 100,"icon": "Setting","created_at": "2024-02-26T14:55:12+08:00","updated_at": "2024-02-26T16:12:34+08:00",
}

平化樹形數據、生成對應的 Map 數據結構:

/*** 菜單相關* 這里是單獨放到了 pinia 中*/
export const useMenuStore = defineStore('menuStore', {state: () => ({menus: [] as Array<RouteRecordRaw>,flatMenuArray: [] as Array<MenuEntity>,flatMenuPathNameMap: new Map<string, string>()}),actions: {generateMenuArrayAndMap(){let menuString = localStorage.getItem('dataMenu')let menusCache = menuString ? JSON.parse(menuString) as Array<MenuEntity> : [] as Array<MenuEntity>let flatMenuArray = recursionMenuData(menusCache)this.flatMenuArray = flatMenuArraythis.flatMenuPathNameMap = new Map(flatMenuArray.map(item => [item.path, item.name]))// 遞歸方法,平化菜單數據function recursionMenuData(menuArray: Array<MenuEntity>){let tempArray: Array<MenuEntity> = []menuArray.forEach(item => {if (item.children && item.children.length > 0){tempArray = tempArray.concat(recursionMenuData(item.children))// 添加本身,并去除 children 屬性delete item.childrentempArray.push(item)} else {tempArray.push(item)}})return tempArray}},}
})

使用的時候

import {useMenuStore, useProjectStore} from "./pinia";
const storeMenu = useMenuStore()
// 當執行下面的操作時就會補全  storeMenu.flatMenuArray 和  storeMenu.flatMenuPathNameMap
storeMenu.generateMenuArrayAndMap()

路由樹的基礎數據是這樣的:

在這里插入圖片描述

平化后的路由數組是這樣的:
在這里插入圖片描述

最終生成的 Map 數據是這樣的:

在這里插入圖片描述

2. 拆分當前路由 path,并匹配

比如當前路由是 /system/normal-setup/auto-login,把它通過 / 拆分之后就是這樣的結果

import {useRoute} from "vue-router";
const route = useRoute()
let routeSectionArray = route.path.split('/').filter(item => item !== '')
// 這樣拆分之后,前面會多出一個空白的 "" ,所以這里剔除了它

在這里插入圖片描述
接下來要做的就是通過上面的 routerSectionArray 生成下面的幾個路由組合,再去之前生成的 Map 中匹配對應的路由名即可

  • /system
  • /system/normal-setup
  • /system/normal-setup/auto-login

匹配之后就是這樣的結果

  • /system 系統配置
  • /system/normal-setup 基礎配置
  • /system/normal-setup/auto-login 自動登錄

代碼是這樣的:

import {useRoute} from "vue-router";
import {onMounted, ref} from "vue";
import {useMenuStore} from "@/pinia";const storeMenu = useMenuStore()
const route = useRoute()const breadCrumbArray = ref<Array<{name: string, path: string}>>([])onMounted(()=>{let routeSectionArray = route.path.split('/').filter(item => item !== '')console.log(routeSectionArray)routeSectionArray.forEach((_, index) => {let path = `/${routeSectionArray.slice(0,index + 1).join('/')}`let pathName = storeMenu.flatMenuPathNameMap.get(path)console.log('---',pathName, path)if (pathName){breadCrumbArray.value.push({name: pathName, path: path})}})
})

四、搭配其它組件構建頁面

弄好上面的 BreadCrumb 組件之后,就可以不用再管它內部的內容了,它會自動根據當前路由值生成對應的內容。
這樣我們就可以放心的把它放到頁面結構中了。

比如我的頁面主要結構是這樣的:

在這里插入圖片描述

Toolerbar.vue

<template><div class="tool-bar"><div class="left"><Breadcrumb/><slot name="left"/></div><div class="center"><slot name="center"/></div><div class="right"><slot name="right"/></div></div>
</template><script setup lang="ts">import Breadcrumb from "@/layout/Breadcrumb.vue";
</script><style scoped lang="scss">
.tool-bar{padding: 0 20px;align-items: center;min-height: 50px;display: flex;flex-flow: row wrap;justify-content: space-between;.left{display: flex;flex-flow: row nowrap;justify-content: flex-start;align-items: center;flex-shrink: 0;}.center{display: flex;flex-flow: row nowrap;justify-content: flex-start;align-items: center;flex-grow: 1;flex-shrink: 0;}.right{display: flex;flex-flow: row nowrap;justify-content: flex-start;align-items: center;flex-shrink: 0;}
}
</style>

Breadcrumb.vue

<template><el-breadcrumb separator="/"><el-breadcrumb-item :to="{ path: '/' }">主頁</el-breadcrumb-item><el-breadcrumb-itemv-for="item in breadCrumbArray":key="item">{{ item.name }}</el-breadcrumb-item></el-breadcrumb>
</template><script setup lang="ts">
import {useRoute} from "vue-router";
import {onMounted, ref} from "vue";
import {useMenuStore} from "@/pinia";const storeMenu = useMenuStore()
const route = useRoute()defineProps( {height: { // 高度type: Number,default: 100}
})const breadCrumbArray = ref<Array<{name: string, path: string}>>([])onMounted(()=>{let routeSectionArray = route.path.split('/').filter(item => item !== '')routeSectionArray.forEach((_, index) => {let path = `/${routeSectionArray.slice(0,index + 1).join('/')}`let pathName = storeMenu.flatMenuPathNameMap.get(path)console.log('---',pathName, path)if (pathName){breadCrumbArray.value.push({name: pathName, path: path})}})
})</script><style lang="scss" scoped>
@import "../assets/scss/plugin";</style>

實際頁面中使用時這樣:

<template><Container><Toolbar><template #left></template><template #center></template><template #right></template></Toolbar><Content></Content></Container>
<template>

五、結果

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/46265.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/46265.shtml
英文地址,請注明出處:http://en.pswp.cn/web/46265.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

爬蟲的概念

爬蟲&#xff08;Web Crawler 或 Web Spider&#xff09;是一種自動化腳本或程序&#xff0c;用于瀏覽萬維網&#xff08;World Wide Web&#xff09;并抓取網頁上的信息。它們按照設定的規則自動地訪問互聯網上的網頁&#xff0c;提取所需的數據&#xff0c;如文本、圖片、視頻…

搭建七日殺服務端系統選擇,系統如何選擇

《七日殺》是一款集合了第一人稱射擊、恐怖生存、塔防與角色扮演要素于一身的開放世界僵尸游戲。玩家需要在美國亞歷桑納地區作為幸存者生存&#xff0c;并探究整個事件背后的真相。對于喜歡這款游戲的玩家來說&#xff0c;搭建自己的專屬服務器不僅能降低延遲&#xff0c;還能…

精通Python數據可視化:Matplotlib柱狀圖、直方圖與餅狀圖實戰解析

精通Python數據可視化&#xff1a;Matplotlib柱狀圖、直方圖與餅狀圖實戰解析 引言 在數據分析和科學研究中&#xff0c;數據可視化扮演著至關重要的角色。Matplotlib是Python中一個廣泛使用的繪圖庫&#xff0c;它提供了豐富的繪圖功能和靈活的定制選項。本文將詳細介紹如何…

ubuntu 可以直接在圖像界面打開命令行嗎

是的&#xff0c;Ubuntu&#xff08;以及其他許多Linux發行版&#xff09;允許用戶直接在圖形界面&#xff08;GUI&#xff09;中打開命令行界面。這通常通過打開一個終端模擬器應用程序來實現&#xff0c;該應用程序提供了一個命令行窗口&#xff0c;用戶可以在其中輸入和執行…

修改文件的默認打開方式

修改文件的默認打開方式 選中文件&#xff0c;右擊&#xff0c;選擇屬性&#xff0c;如圖然后點擊更改&#xff0c;選擇想要的打開方式&#xff0c;再依次點擊 應用、保存 即可&#xff0c;如圖

Linux 環境下整體備份遷移 Docker 鏡像及數據教程

1. 介紹 本教程將引導您如何在 Linux 環境下備份和遷移 Docker 鏡像及其數據。我們將逐步介紹相關步驟&#xff0c;包括 Docker 鏡像的導出和導入、數據卷的備份和恢復等。通過本教程&#xff0c;您將能夠輕松掌握 Docker 容器的遷移操作。 2. 前置準備 在開始之前&#xff…

Redis中數據分片與分片策略

概述 數據分片是一種將數據分割并存儲在多個節點上的技術&#xff0c;可以有效提高系統的擴展性和性能。在Redis中&#xff0c;數據分片主要用于解決單個實例存儲容量和性能瓶頸的問題。通過將數據分散存儲到多個Redis節點中&#xff0c;可以將負載均衡到不同的服務器上&#…

Visual Studio使用——在vs中給vb.net項目添加新的窗口:新建的方式、添加已有窗口的方式

目錄 引出Visual Studio使用vb添加新的窗體自定義代碼片段vs顯示所有文件 總結Idea安裝和使用0.Java下載 和 IDEA工具1.首次新建項目2.隱藏文件不必要顯示文件3.目錄層級設置4.Settings設置選擇idea的場景提示代碼不區分大小寫 取消git的代碼作者顯示 引出 Visual Studio使用—…

基于Vue CLI 3構建Vue3項目(Vue2也可參考)

天行健&#xff0c;君子以自強不息&#xff1b;地勢坤&#xff0c;君子以厚德載物。 每個人都有惰性&#xff0c;但不斷學習是好好生活的根本&#xff0c;共勉&#xff01; 文章均為學習整理筆記&#xff0c;分享記錄為主&#xff0c;如有錯誤請指正&#xff0c;共同學習進步。…

Android Framework學習筆記(4)----Zygote進程

Zygote的啟動流程 Init進程啟動后&#xff0c;會加載并執行init.rc文件。該.rc文件中&#xff0c;就包含啟動Zygote進程的Action。詳見“RC文件解析”章節。 根據Zygote對應的RC文件&#xff0c;可知Zygote進程是由/system/bin/app_process程序來創建的。 app_process大致處…

PHP手邊酒店多商戶版平臺小程序系統源碼

&#x1f3e8;【旅行新寵】手邊酒店多商戶版小程序&#xff0c;一鍵解鎖住宿新體驗&#xff01;&#x1f6cc; &#x1f308;【開篇&#xff1a;旅行新伴侶&#xff0c;盡在掌握】&#x1f308; 還在為旅行中的住宿選擇而糾結嗎&#xff1f;是時候告別繁瑣的搜索和比價過程&a…

MT6985(天璣9200)芯片性能參數_MTK聯發科旗艦5G移動平臺處理器

MT6985天璣 9200 旗艦移動平臺擁有專業級影像、沉浸式游戲和先進移動顯示技術&#xff0c;以及更快捷、覆蓋更廣的 5G 和 支持 Wi-Fi 7 連接&#xff0c;具有高性能、高能效、低功耗表現。率先采用 Armv9 性能核&#xff0c;全部支持純 64 位應用&#xff0c;開啟高能效架構設計…

【數據庫學習】java數據庫開發:sql解析之jsqlparser

1&#xff0c;概念 1&#xff09; SQL 解析器 用于處理 SQL 查詢語句的解析和分析。 場景&#xff1a; 數據庫客戶端開發&#xff0c;解析用戶輸入的sql語法并執行。自定義sql解析和執行邏輯。 標準的數據庫接口&#xff08;如 JDBC&#xff09;無法完全滿足需求時&#xff…

音頻數據集

1 多語言 Mozilla Common Voice 下載地址&#xff1a;https://voice.mozilla.org/data 時長&#xff1a;1965小時&#xff08;目前為止&#xff09; 最早2017年發布&#xff0c;持續更新&#xff0c;該基金會表示&#xff0c;通過 Common Voice 網站和移動應用&#xff0c;他們…

搞定前端面試題——ES6同步與異步機制、async/await的使用以及Promise的使用!!!

文章目錄 同步和異步async/awaitPromisePromise的概念 同步和異步 ? 同步&#xff1a;代碼按照編寫順序逐行執行&#xff0c;后續的代碼必須等待當前正在執行的代碼完成之后才能執行&#xff0c;當遇到耗時的操作&#xff08;如網絡請求等&#xff09;時&#xff0c;主線程會…

Java二十三種設計模式-抽象工廠模式(3/23)

抽象工廠模式&#xff1a;復雜系統的靈活構建者 引言 在軟件開發中&#xff0c;抽象工廠模式是一種提供接口以創建相關或依賴對象族的創建型設計模式。這種模式允許客戶端使用一個共同的接口來創建不同的產品族&#xff0c;而無需指定具體類。 基礎知識&#xff0c;java設計模…

SpringBoot日常:常用數據類型比較

文章目錄 前言基本類型引用類型date類型比較LocalDate類型比較LocalDateTime類型比較Bigdecimal類型比較對象類型比較 前言 在Java中,我們一般分為基本類型的比較和引用類型的比較&#xff0c;下面按照這兩個大分類梳理一下日常用到的類型比較 基本類型 基本數據類型比較主要…

算法 —— LRU算法

算法 —— LRU算法 LRULRU算法的工作原理&#xff1a;實現方法&#xff1a;性能考慮&#xff1a; 模擬過程splice函數對于std::list和std::forward_list基本語法&#xff1a;功能描述&#xff1a; 示例&#xff1a;注意事項&#xff1a; 如果大家已經學習過了Cache的替換算法和…

ElementUIV12相關使用方法

今日內容 零、 復習昨日 零、 復習昨日 一、Element UI Element&#xff0c;一套為開發者、設計師和產品經理準備的基于 Vue 2.0 的桌面端組件庫 官網&#xff1a; https://element.eleme.cn/#/zh-CN Element Plus,基于 Vue 3&#xff0c;面向設計師和開發者的組件庫 官網: htt…

C語言--遞歸

曾經有一個段子&#xff1a;上大學時&#xff0c;我們的c語言老師說&#xff1a;學c時&#xff0c;如果有50%的同學死在了循環上面&#xff0c;那么就有90%的同學死在了遞歸上面。接下來&#xff0c;就來看看遞歸是怎么個事&#xff1f; 一.遞歸的介紹 遞歸是指一個函數直接或…