当前位置: 首页 > news >正文

多级侧边菜单(递归)

在这里插入图片描述

需要编写两个文件 aside-menu.vue 和 menu-item.vue

  1. menu-item.vue
<script setup>
defineOptions({name: 'MenuItem'})
defineProps({menuList: Array})
</script><template><template v-for="menu of menuList"><!-- 如果当前有子菜单,且子菜单只有一个时 --><el-menu-item v-if="menu.children && menu.children.length === 1" :index="menu.path"><el-icon><component :is="menu?.meta?.icon"></component></el-icon><template #title><span>{{ menu.children[0]?.meta?.title }}</span></template></el-menu-item><!-- 如果当前有子菜单,且子菜单大于一个时 --><el-sub-menuv-if="menu.children && menu.children.length > 1":index="menu.path"><template #title><el-icon><component :is="menu?.meta?.icon"></component></el-icon><span>{{ menu?.meta?.title }}</span></template><!-- 调用自身  此处是重点--><MenuItem :menuList="menu.children"></MenuItem></el-sub-menu><!-- 如果没有子菜单,则显示当前内容 --><el-menu-item v-if="!menu.children || menu.children.length===0" :index="menu.path"><el-icon><component :is="menu?.meta?.icon"></component></el-icon><template #title><span>{{ menu?.meta?.title }}</span></template></el-menu-item></template>
</template><style lang="scss" scoped></style>
  1. aside-menu.vue (menuList在该组件中请求后端接口获取)
<script setup>
import MenuItem from "./menu-item.vue";defineProps({isCollapse: {type: Boolean,default: true}
})
// 菜单列表
let menuList =[{path: '/',name: 'Layout',redirect: '/home',component: '/views/layout/index',meta: {title: 'Layout',icon: 'HomeFilled',hidden: false},children: [{path: '/home',name: 'Home',component: '/views/home/index',meta: {title: '首页',icon: 'HomeFilled',hidden: false}},]},{path: '/sys',name: 'Sys',component: '/views/layout/index',meta: {title: '系统管理',icon: 'document',hidden: false},children: [{path: '/sys/user',name: 'User',component: '/views/sys/user/index',meta: {title: '用户管理',icon: 'document',hidden: false}},{path: '/sys/role',name: 'Role',component: '/views/sys/role/index',meta: {title: '角色管理',icon: 'document',hidden: false}},]}
]//通过递归 将 menuList 属性hidden为true的菜单及其子菜单过滤掉
function filterHiddenMenu(menuList) {return menuList.filter(menu => {if (menu.children) {menu.children = filterHiddenMenu(menu.children)}return !menu.hidden})
}menuList = filterHiddenMenu(menuList)
</script><template><div><el-menu :collapse="isCollapse" :collapse-transition="false"><MenuItem :menu-list="menuList"></MenuItem></el-menu></div>
</template><style lang="scss" scoped>
.el-menu {height: 100%;width: 100%;
}
</style>
  1. 使用我们编写的 aside-menu组件
<script setup>
import {ref} from "vue";
import AsideMenu from "./aside-menu/index.vue";// 是否折叠菜单,默认折叠
const isCollapse = ref(true)</script><template><AsideMenu :isCollapse="isCollapse"></AsideMenu>
</template><style scoped lang="scss">
</style>

相关文章:

  • 汽车3d动画渲染选择哪个?选择最佳云渲染解决方案
  • 2025年营收1亿美元咨询代理机构的游戏策略:基于AIGC的无限可扩展业务
  • 默认成员函数的练习之实现日期类
  • Linux 学习笔记(十六)—— 重定向与缓冲区
  • Growthly Quest 增长工具:助力 Web3 项目实现数据驱动的增长
  • MySQL vs PostgreSQL:2024年深度对比与选择指南
  • 后端返回内容有换行标识,前端如何识别换行
  • 14.安卓逆向-frida基础-编写hook脚本2
  • 【Python】数据可视化之分布图
  • 在C#中实现WebSocket的单聊和分频道聊天
  • 域 缺省参数 函数重载 引用
  • 【Golang】Go语言中如何面向对象?
  • 【研赛A题成品论文】24华为杯数学建模研赛A题成品论文+可运行代码丨免费分享
  • GO Serial 学习与使用
  • 大模型微调4:Alpaca模型微调、Adalora、Qlora
  • 4个实用的微服务测试策略
  • Babel配置的不完全指南
  • Java超时控制的实现
  • JS变量作用域
  • Nacos系列:Nacos的Java SDK使用
  • React中的“虫洞”——Context
  • 电商搜索引擎的架构设计和性能优化
  • 规范化安全开发 KOA 手脚架
  • 前嗅ForeSpider采集配置界面介绍
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 详解移动APP与web APP的区别
  • 学习JavaScript数据结构与算法 — 树
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 策略 : 一文教你成为人工智能(AI)领域专家
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • (06)金属布线——为半导体注入生命的连接
  • (LeetCode) T14. Longest Common Prefix
  • (二)fiber的基本认识
  • (二十四)Flask之flask-session组件
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (六)Flink 窗口计算
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (四)activit5.23.0修复跟踪高亮显示BUG
  • (译) 函数式 JS #1:简介
  • (原)本想说脏话,奈何已放下
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (源码分析)springsecurity认证授权
  • (杂交版)植物大战僵尸
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • ******之网络***——物理***
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .gitignore文件---让git自动忽略指定文件
  • .mp4格式的视频为何不能通过video标签在chrome浏览器中播放?
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net 调用php,php 调用.net com组件 --
  • .NET 反射 Reflect
  • .Net(C#)自定义WinForm控件之小结篇
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded