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.mzph.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的效果更好。但是针对不同的数据…

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> --><…

三步在 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;帮助你找回那些遗…

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;当点位…

霍庭格TruPlasma MF 7100 7050电源现货50KW

霍庭格TruPlasma MF 7100 7050电源现货50KW

【C语言深度解剖】:(11)函数指针、函数指针数组、指向函数指针数组的指针、回调函数

&#x1f921;博客主页&#xff1a;醉竺 &#x1f970;本文专栏&#xff1a;《C语言深度解剖》《精通C指针》 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多C语言深度解剖点击专栏…

AVDemo漏洞平台黑盒测试

信息收集 说明一下&#xff1a; 因为是本地的环境&#xff0c;端口这些就不扫描了&#xff0c; 还有这个是某个dalao写的平台&#xff0c;也就检测不到什么cms了&#xff0c; 信息收集&#xff0c;端口&#xff0c;cms这些是必做的&#xff0c; 首先&#xff0c;这里先简单的…

web3 ETF软件开发难点

开发一个涉及到 Web3 ETF&#xff08;Exchange-Traded Fund&#xff0c;交易所交易基金&#xff09;的软件可能会面临一些挑战和难点&#xff0c;特别是在整合 Web3 技术和金融服务方面。以下是一些可能的难点。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&am…

记一次:mysql统计的CAST函数与json字段中的某个字段

前言&#xff1a;因为需求的问题&#xff0c;会遇到将某个json存入到一个字段中&#xff0c;但在统计的时候&#xff0c;又需要将这个json中的某个字段作为条件来统计&#xff0c;所以整理了一下cast函数和json中某个字段的条件判断 一、浅谈mysql的json 1.1 上例子 SELECTli…

植物大战僵尸杂交版(含下载方式)

最近时间&#xff0c;一款很火的植物大战僵尸杂交版火爆出圈&#xff0c;在玩家之间疯狂扩散。各种奇特的杂交组合让游戏变得更加有趣。 游戏介绍 植物大战僵尸杂交版是一款将《植物大战僵尸》和植物杂交概念结合在一起的独特塔防策略游戏。它将《植物大战僵尸》中的植物与进行…

Minio 对象存储 OSS概述

系列文章目录 第五章 Minio 对象存储 OSS概述 Minio 对象存储 OSS概述 系列文章目录对象存储 OSS基本概念存储空间&#xff08;Bucket&#xff09;对象&#xff08;Object&#xff09;ObjectKeyRegion&#xff08;地域&#xff09;Endpoint&#xff08;访问域名&#xff09;Ac…

C#知识|上位机子窗体嵌入主窗体方法(实例)

哈喽,你好啊,我是雷工! 上位机开发中,经常会需要将子窗体嵌入到主窗体, 本节练习C#中在主窗体的某个容器中打开子窗体的方法。 01 需求说明 本节练习将【账号管理】子窗体在主窗体的panelMain容器中打开。 账号管理子窗体如下: 主窗体的panelMain容器位置如图: 02 实现…

一次JAVA接口优化记录

目录 一次接口优化记录首先考虑&#xff0c;添加缓存缓存策略方案一&#xff1a;本地缓存方案二&#xff1a;Redis缓存 优化结果原因分析&#xff1a;原因验证 接口数据分析将响应数据返回大小减少compression压缩配置完美&#xff08;代指这里的小系统&#xff09; 一次接口优…