Element Plus/vue3 無限級導航實現

在使用element plus 時,最初要使用的就是導航組件了,官網上看到的也就是寫死的一級/二級導航,那么如何設計一個無限級且動態的導航呢?毋庸置疑,遞歸。廢話不多說,直接看代碼和效果:
代碼:

8784c28b7e48b0055253bc69c854d4d9.png
目錄結果

SidebarItem.vue

<template><el-menu-item :index="item ? item.url : ''" v-if="!item || !item.children || item.children.length === 0">{{ item?.menuName }}</el-menu-item><el-sub-menu :index="item ? item.id : ''" v-else><template #title><span class="tab">{{ item?.menuName }}</span></template><div v-for="(child, index) in item?.children" :key="index"><template v-if="child.children && child.children.length > 0"><sidebar-item :key="child.id" :item="child" /></template><el-menu-item v-else :index="child.url"><span class="tab sub">{{ child.menuName }}</span></el-menu-item></div></el-sub-menu>
</template><script lang="ts" setup>
import { PropType, toRefs } from 'vue';
import { MenuNode } from '../../../../model/menuNode';const props = defineProps({collapse: {type: Boolean,default: true},item: {type: Object as PropType<MenuNode>,},
});const { item } = toRefs(props);
</script><style lang="scss"></style>

Index.vue

<div class="nav"><el-scrollbar class="scrollbar"><el-menu class="menu" @open="handleOpen" @close="handleClose" mode="horizontal" router><SidebarItem v-for="route in menuList" :key="route.id" :item="route"></SidebarItem></el-menu></el-scrollbar></div>

測試數據:

export default [{'id': '001','parentId': '0','menuName': '首頁','url': '/dashboard','sortNo': 1,'icon': 'Aim'},{'id': '002','parentId': '0','menuName': '表格','url': '/charts','sortNo': 4,'icon': 'ArrowDownBold'},{'id': '0021','parentId': '002','menuName': '樹狀圖','url': '/charts/charts1','sortNo': 4,'icon': 'ArrowDownBold'},{'id': '0022','parentId': '002','menuName': '餅狀圖','url': '/charts/charts2','sortNo': 4,'icon': 'ArrowDownBold'},{'id': '003','parentId': '0','menuName': '測試四級1','url': '/dashboard','menuType': 1,'sortNo': 2,'icon': 'Aim'},{'id': '0031','parentId': '003','menuName': '測試四級2','url': '/dashboard','menuType': 1,'sortNo': 2,'icon': 'Aim'},{'id': '00311','parentId': '0031','menuName': '測試四級3','url': '/dashboard','menuType': 1,'sortNo': 2,'icon': 'Aim'},{'id': '003111','parentId': '00311','menuName': '測試四級4','url': '/dashboard','menuType': 1,'sortNo': 2,'icon': 'Aim'},
];

這里需要將數組轉換成樹形結構,也附上代碼好了(純手工輸出,有bug還望見諒):

/** @Author: zzh* @Date: 2022-03-01 14:39:16* @LastEditors: zzh* @LastEditTime: 2022-04-10 17:13:03* @Description: 數據轉換幫助類* @FilePath: \zh-admin\src\utils\dataConvert.ts*/import { MenuNode } from '../model/menuNode';// 由于菜單數據并非一顆樹,而是多棵樹組成的數據,顧當成由樹組成的數組的處理
const convertMenuArrToTree = (array: Array<MenuNode>) => {const rootMenus = array.filter(x => x.parentId === '0');const childrenMenus = array.filter(x => x.parentId !== '0');for (let i = 0; i < rootMenus.length; i++) {if (childrenMenus.find(x => x.parentId === rootMenus[i].id)) {rootMenus[i].children = getRootMenuChild(rootMenus[i].id, childrenMenus);} else {rootMenus[i].children = [];}}return rootMenus;
};const getRootMenuChild = (id: string, childrenMenus: Array<MenuNode>): Array<MenuNode> => {const menus = childrenMenus.filter(x => x.parentId === id);for (let i = 0; i < menus.length; i++) {if (childrenMenus.find(x => x.parentId === menus[i].id)) {menus[i].children = getRootMenuChild(menus[i].id, childrenMenus);} else {menus[i].children = [];}}return menus;
};export {convertMenuArrToTree,
};

展示結果:

af47773eb6924169c74f22b03c8a2adb.png

?

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

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

相關文章

Jmeter:錄制腳本(操作文檔)

新建線程組 打開jmeter&#xff0c;右鍵測試計劃–>添加–>Threads(Users)–>點擊"線程組" 添加錄制控制器 右鍵線程組–>添加–>邏輯控制器–>點擊"錄制控制器" 添加HTTP代理服務器 右鍵工作臺–>添加–>非測試元件–>…

YOLOv5改進 | Neck | 添加雙向特征金字塔BiFPN【小白輕松上手 | 論文必備】

&#x1f680;&#x1f680;&#x1f680;本專欄所有的改進均可成功執行&#x1f680;&#x1f680;&#x1f680; 盡管Ultralytics 推出了最新版本的 YOLOv8 模型。但YOLOv5作為一個anchor base的目標檢測的算法&#xff0c;YOLOv5可能比YOLOv8的效果更好。但是針對不同的數據…

CDN都有哪些優勢?

內容分發網絡是一個經策略性部署的整體系統&#xff0c;其中包含了分布式存儲、負載均衡、網絡請求的重定向和內容管理四個要求&#xff0c;CDN的主要核心則是內容管理和全局的網絡流量管理&#xff0c;CDN可以確保內容會以一種非常高效的方式為用戶的請求提供服務。 接下來就讓…

Linux 第三十五章

&#x1f436;博主主頁&#xff1a;??. 一懷明月? ???&#x1f525;專欄系列&#xff1a;線性代數&#xff0c;C初學者入門訓練&#xff0c;題解C&#xff0c;C的使用文章&#xff0c;「初學」C&#xff0c;linux &#x1f525;座右銘&#xff1a;“不要等到什么都沒有了…

Kubernetes安裝calico網絡插件失敗

今天啥也沒干成&#xff0c;不想排版了。 接著昨天搭建k8s集群&#xff0c;安裝calico插件&#xff0c;虛擬機一直卡。 # 在 master 節點上執行 # 下載 calico 配置文件&#xff0c;可能會網絡超時 curl https://docs.tigera.io/archive/v3.25/manifests/calico.yaml -O # 修…

[svelte] 怎么引入fortawesome的icon樣式

首先在項目的終端下執行以下命令 npm install fortawesome/fontawesome-free # 或者 yarn add fortawesome/fontawesome-free這樣子可以把fontawsome的圖標給下載到項目的對應文件中 一般都是在node_modules中 在fontawsome/fontawesome-free中就可以看到很多文件夾了 …

unapp寫微信小程序封裝水印相機組件怎么實現?

<template><view><!-- <cu-custom bgColor"bg-gradual-blue" :isBack"true"><block slot"backText">返回</block><block slot"content">編輯資料</block></cu-custom> --><…

Docker學習(10)搭建kubernetes集群

搭建kubernetes集群 1、官方部署方式&#xff1a; Minikube工具安裝 Minikube是一種能夠在計算機或者虛擬機(VM)內輕松運行單節點Kubernetes 集群的工具&#xff0c;可實現一鍵部署。這種方式安裝的系統在企業中大多被當作測試系統使用。 使用yum安裝 通過直接使用 epel-r…

三步在 vite 中配置 tailwindcss

前言 tailwindcss 是一個原子化的 css 工具&#xff0c;可以讓你免于寫 css&#xff0c;只寫 html 即可原理&#xff1a;利用你寫的 html 的 class 名稱來生成 css 樣式&#xff0c;理解為一個 postcss 插件或 loader 第一步&#xff1a;安裝 tailwindcss npm i -D tailwind…

圖片恢復的實用指南,為你拯救遺失的記憶!

隨著科技的日新月異&#xff0c;我們的生活已被照片填滿。它們記錄著我們的喜怒哀樂&#xff0c;見證著每一個重要的時刻。但我們往往會因為各種原因將手機圖片遺失&#xff0c;有什么方法可以恢復呢&#xff1f;本文將提供一份實用的圖片恢復指南&#xff0c;幫助你找回那些遺…

山西大學化學化工學院朱鳳祥教授簡介

男&#xff0c;1989年出生&#xff0c;河南安陽人&#xff0c;2019年1月于山西大學化學化工學院任特聘教授&#xff0c;主要研究方向為有機催化&#xff0c;曾獲國家自然科學基金資助&#xff08;2020-2023&#xff09;&#xff0c;迄今在國際高級雜志發表SCI論文20余篇。 200…

llama使用tutorial微調(windows版本)

Llama3-Tutorial/docs/assistant.md at main SmartFlowAI/Llama3-Tutorial GitHub 有一些命令需要修改 前期的安裝還是要按照教程搞的 streamlit run ~/Llama3-Tutorial/tools/internstudio_web_demo.py \ ~/model/Meta-Llama-3-8B-Instruct 改為了 streamlit run .\Ll…

ArrayList和LinkedList的使用

ArrayList List<> list new ArrayList<>(); LinkedList

SQL注入漏洞常用繞過方法

SQL注入漏洞 漏洞描述 Web 程序代碼中對于用戶提交的參數未做過濾就直接放到 SQL 語句中執行&#xff0c;導致參數中的特殊字符打破了原有的SQL 語句邏輯&#xff0c;黑客可以利用該漏洞執行任意 SQL 語句&#xff0c;如查詢數據、下載數據、寫入webshell 、執行系統命令以及…

WPF使用ItemsControl顯示Object的所有屬性值

對于上位機開發&#xff0c;我們有時候有這樣的需求&#xff1a;如何顯示所有的IO點位&#xff1f;比如有10個IO點位&#xff0c;那我們要寫10個TextBlock去綁定這10個點位的屬性&#xff08;本文暫時不考慮顯示的樣式&#xff0c;當然也可以考慮&#xff09;&#xff0c;當點位…

springboot整合swagger,jpa遇到的問題

1.整合jpa&#xff0c;版本問題導致Archive for required library: ‘C:/Users/Administrator/.m2/repository/org/aspectj/aspectjweaver/1.8.13/aspectjweaver-1.8.13.jar’ in project ‘money-server’ cannot be read or is not a valid ZIP file money-server Build path…

Leetcode 257:二叉樹的所有路徑

給你一個二叉樹的根節點 root &#xff0c;按 任意順序 &#xff0c;返回所有從根節點到葉子節點的路徑。 葉子節點 是指沒有子節點的節點。 思路&#xff1a; 先編輯所有節點&#xff0c;記錄每一個節點的路徑&#xff1b; 判斷當前節點是否為葉子節點&#xff0c;如果是&…

霍庭格TruPlasma MF 7100 7050電源現貨50KW

霍庭格TruPlasma MF 7100 7050電源現貨50KW

mysql json 數組怎么搜索

在MySQL中&#xff0c;可以使用JSON_CONTAINS函數來搜索JSON數組中的元素。這里有一個簡單的例子&#xff1a; 假設有一個名為items的表&#xff0c;其中有一個名為attributes的列&#xff0c;包含JSON數組。 CREATE TABLE items (id INT AUTO_INCREMENT PRIMARY KEY,attribu…

SQLSERVER 怎樣使查詢不占鎖

對一些相對不怎么敏感的數據&#xff0c;不需要太及時性的數據&#xff0c;不需要占鎖。 要在SQL Server中執行查詢而不占用鎖&#xff0c;可以采取以下幾個策略&#xff1a; 1、使用NOLOCK提示&#xff1a; 最直接但風險較高的方法是在查詢中使用WITH (NOLOCK)提示。這樣&am…