vue3 antd多级动态菜单(二)后台管理系统(两种方法过滤有无子菜单children)

news2025/7/11 18:34:16

vue3 antd 多级动态菜单(精修版本) 两种方法实现对children的筛选

  • 相关文章推送(供参考)
  • 场景复现
  • 实现效果
  • 解决方法
    • hasChildren与noChilren函数过滤
    • v-if v-else判断有无children【推荐】🔥
    • 两种方法公用代码
  • sunmmary
  • 下期预告
    • 搜索栏的筛选功能
    • axios请求

相关文章推送(供参考)

相关文章链接
vue3【列表渲染】v-for 详细介绍(vue中的“循环”)
vue3+ant design vue+ts实战【ant-design-vue组件库引入】🔥
vue3 antd多级动态菜单(一)后台管理系统(v-for循环)🔥🔥

场景复现

⚡上期文章⚡中,我们简单的实现了多级动态菜单,在它的基础上,我们可以用v-for循环嵌套很多层的子菜单,但在实际开发中,大概也只会用到 三级菜单,具体的内容呈现会放在页面当中,无需过多的细分。但是,上期的代码显然存在不足——缺少 有无children子菜单 的判断

简单来说,在不判断是否有children的情况下,一级菜单内部有两个子菜单(也可称为二级菜单),倘若需要实现多个一级菜单,有的一级菜单内部是有二级菜单的,而有的一级菜单内部是没有二级菜单的。如果我们不对子菜单的有无进行判断,就会导致每个一级菜单的内部都会默认循环有两个二级菜单

  • 解决的方式可以是放弃循环单独实现这一行一级菜单,但是你又会涉及到它的排序问题(如果它不参与循环,那它的位置应该按照先后顺序放在在循环体的中间,还是放在循环体的外面),而不采用循环很显然是一个不明智的选择,所以这个方法直接pass掉。
  • 解决方式也可以是对有无children进行判断根据条件筛选,最后实现需求

本期文章将详细介绍比较好用的两种方法:
👇👇👇👇👇👇👇👇👇👇👇👇👇👇

用`hasChildren与noChildren函数过滤
用v-if v-else判断有无children(推荐)
两种方法都差不多,简洁快速的方式可选择②。

实现效果

上期文章简单实现效果👇👇👇
在这里插入图片描述
本期文章完善后的实现效果👇👇👇
在这里插入图片描述
是不是完美了许多,下面具体介绍两种解决方案。

解决方法

文章使用的组件库为 ant design vue 具体使用方法(点击跳转查看)

hasChildren与noChilren函数过滤

代码图片(含注释)
在这里插入图片描述
源码:(layout布局中的slider部分)【记得引入menu】

<a-layout-sider v-model:collapsed="collapsed" collapsible>
      <div class="logo" />
      <a-menu v-model:selectedKeys="selectedKeys" v-model:openKeys="openKeys"  theme="dark" mode="inline">
        <!-- 一级菜单 -->
					<a-sub-menu :key="item.id" v-for="item of hasChildren()"><!-- 将-->
						<template #title>
                            <Icon :icon="item.iconClass"></Icon>
							<span v-if="item.children !== null">{{item.authName}}</span>
							<!-- <span v-else @click="toHome()">{{item.authName}}</span> -->
						</template>
						<!-- 二级菜单 -->
						<a-menu-item v-for="sub of item.children" :key="sub.id" >
							<router-link :to="'/' + sub.path">
								<!-- <a-icon :type="sub.type" /> -->
								<span>{{sub.authName}}</span>
							</router-link>
						</a-menu-item>
					</a-sub-menu>
                        <a-menu-item :index="item.path" v-for="item of noChildren()" :key="item.id" >
							<router-link :to="'/' + item.path">
								<Icon :icon="item.iconClass" />
								<span>{{item.authName}}</span>
							</router-link>
						</a-menu-item>
      </a-menu>
</a-layout-sider>

代码图片(含注释)
在这里插入图片描述
源码(script setup中的两个过滤函数)

const noChildren = () => {
  return menu.filter((item) => !item.children); 
}
noChildren()
const hasChildren = () => {
  return menu.filter((item) => item.children);
}
hasChildren()

实现效果
在这里插入图片描述

v-if v-else判断有无children【推荐】🔥

推荐理由

  • 相比第一种方法,更加简洁,省去两个方法。
  • 采用vue原生语法中的v-ifv-else,简单直接地实现效果。

代码图片(含注释)
在这里插入图片描述
(代码按需添加即可,这里就不附加源码了)
实现效果
在这里插入图片描述

两种方法公用代码

router.ts部分源码:

    {
        path: "/home",
        name: "Home",
        component: () => import("../views/Home.vue"),
        children: [
            {
                path: '/newStudent/newStudentArticle',
                component: () => import("../views/newStudent/newStudnetArticle/newStudent_article.vue"),
                meta: {
                    routerName:["新生2022", "新生板块文章"]
                }
            },
            {
                path: '/newStudent/newStudentDiskArea',
                component: () => import("../views/newStudent/diskArea/diskArea.vue"),
                meta: {
                    routerName:["新生2022", "新生板块磁片区"]
                }
            },
            {
                path:'/count',
                component: () => import("../views/countDown/count.vue"),
                meta:{
                    routerName:["默认倒计时"]
                }
            },
        ]
    }

menu.ts代码图片:
在这里插入图片描述
menu.ts源码:

const menus = [
    /* eslint-disable */
    {
      "id": 100,
      "authName": "新生2022",
      "iconClass": "UserOutlined",
      "path": "newStudent",
      "children": [{
          "id": 101,
          "authName": "新生文章",
          "iconClass": "Reading",
          "path": "newStudent/newStudentArticle",
          "children": []
      }, {
          "id": 102,
          "authName": "磁片区",
          "iconClass": "Magnet",
          "path": "newStudent/newStudentDiskArea",
          "children": []
      },]
    },
    {
      "id":110,
      "authName":"默认倒计时",
      "iconClass":"HistoryOutlined",
      "path":"count",
    },
  ]
  
  export default menus

sunmmary

  • 以上就是对多级动态菜单的优化实现。不管是子菜单的筛选判断,还是项目文件的功能化分化,相较与上期的简单实现都有很大提升。

下期预告

搜索栏的筛选功能

axios请求

导航栏的高质量实现非常重要,如果文章对大家有帮助或者价值,建议点赞收藏,方便后续查看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/5659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP32 入门笔记06: WIFI时钟 + FreeRTOS+《两只老虎》 (ESP32 for Arduino IDE)

ESP32FreeRTOS Esp32 模块中已经提供了 FreeRTOS&#xff08;实时操作系统&#xff09;固件。 FreeRTOS有助于提高系统性能和管理模块的资源。FreeRTOS允许用户处理多项任务&#xff0c;如测量传感器读数&#xff0c;发出网络请求&#xff0c;控制电机速度等&#xff0c;所有…

靶向肿瘤代谢,助力攻克癌症

肿瘤代谢的简介 肿瘤代谢的起源在于奥托沃伯格 (Otto Warburg) 的假设&#xff0c;他也因发现线粒体呼吸链复合物 IV 而获得 1931 年诺贝尔生理学或医学奖。Warburg 观察到&#xff0c;与正常组织相比&#xff0c;体外癌组织切片使用大量葡萄糖生成乳酸 (即使在有氧的情况下也是…

SBT10100VDC-ASEMI低压降贴片肖特基二极管SBT10100VDC

编辑-Z SBT10100VDC在TO-263封装里采用的2个芯片&#xff0c;其尺寸都是62MIL&#xff0c;是一款低压降贴片肖特基二极管。SBT10100VDC的浪涌电流Ifsm为150A&#xff0c;漏电流(Ir)为4uA&#xff0c;其工作时耐温度范围为-65~150摄氏度。SBT10100VDC采用金属硅芯片材质&#x…

QScintilla代码跳转时indicator工作不正确的问题

首先看我这几个文章&#xff0c;知道一下indicator是什么&#xff0c;以及上下文&#xff1a; https://biao2488890051.blog.csdn.net/article/details/126798996?spm1001.2014.3001.5502 目标&#xff1a; 我现在要做按住 ctrl 鼠标左键点击释放 发生函数/变量的 定义/声明…

Pandas中你一定要掌握的时间序列相关高级功能

&#x1f4a1; 作者&#xff1a;韩信子ShowMeAI &#x1f4d8; 数据分析实战系列&#xff1a;https://www.showmeai.tech/tutorials/40 &#x1f4d8; 本文地址&#xff1a;https://www.showmeai.tech/article-detail/389 &#x1f4e2; 声明&#xff1a;版权所有&#xff0c;转…

ceph浅谈

总谈 ceph简介 用上ceph&#xff0c;多台机器的磁盘空间在一起了&#xff0c;在一台机器上就可以看到使用所有空间。 还可以保存多份安全备份 存储先ceph&#xff0c;自我管理修复&#xff0c;跨机房&#xff0c;节点越多&#xff0c;并行化&#xff0c;论上&#xff0c;节点越…

【虚幻引擎UE】UE5 实现相机录制视频并导出(C++调用外部exe)

说明: 该功能暂不支持导出声音。 由于OpenCV3和UE5不太兼容,因此考虑制作外部exe实现视频合成。 一、创建渲染目标 二、创建Actor加场景捕获组件2D 三、创建UE5内的C++代码 1、实现 SavePicToFile 导出图片蓝图函数 .cpp文件 // Fill out your copyright notice in the De…

数字集成电路设计(二、Verilog HDL基础知识)

文章目录1. 语言要素1.1 空白符1.2 注释符1.3 标识符1.3.1 转义标识符1.4 关键字1.5 数值1.5.1 整数及其表示方式1.5.2 实数及其表示方式1.5.3 字符串及其表示方式2. 数据类型2.1 物理数据类型2.1.1 连线型2.1.2 寄存器型2.2 连线型和寄存器型数据类型的声明2.2.1 连线型数据类…

深入了解海豚调度DolphinScheduler

深入了解海豚调度DolphinScheduler一、海豚调度介绍二、海豚调度特性三、建议配置四、名词解释五、模块介绍六、功能介绍1.项目首页2.工作流定义3.工作流实例4.任务实例5.任务定义七、任务类型1.SQL2.SPARK节点3.Apache Zeppelin八、集群部署1.前置准备工作2.准备 DolphinSched…

实现注册与登录模块

目录 1、加载依赖 2、实现jwt工具类jwtUtil类 3、实现config.filter.JwtAuthenticationTokenFilter类 4、配置config.SecurityConfig类 5、创建后端api之前对数据库进行修改 6、写API一共需要的三个地方 7、实现三个接口 8、验证用户登录用API调试 9、https://jwt.io/解…

MySQL表的增删查改(CRUD)

文章目录前言一、新增数据二、查询数据全列查询指定列查询表达式查询指定别名查询去重查询排序查询条件查询分页查询三、修改数据四、删除数据前言 CRUD代表: 增加(create) ,查询(retrieve) ,更新(update) ,删除(delete) 单词首字母。 一、新增数据 SQL使用insert关键字来表…

二叉搜索树、红黑树详解、红黑树高的应用、TreeMap的应用(图文详解)-Kotlin版本代码

二叉搜索树 何为二叉搜索树&#xff1f; 二叉搜索树是一种特殊的二叉树&#xff0c;它的左子节点总是小于或等于根节点&#xff0c;而右子节点 总是大于或等于根节点。 如下图&#xff0c;即是一颗二叉搜索树。 对于二叉搜索树来说&#xff0c;中序遍历可以遍历按照节点值…

【JavaSE】重载和重写

前言&#xff1a; 作者简介&#xff1a;爱吃大白菜1132 人生格言:纸上得来终觉浅&#xff0c;绝知此事要躬行 如果文章知识点有错误的地方不吝赐教&#xff0c;和大家一起学习&#xff0c;一起进步&#xff01; 如果觉得博主文章还不错的话&#xff0c;希望三连支持&#xff01…

python--敲击木鱼积累功德小项目(更新版(2))

前言&#xff1a;前几天上课闲着没事写了一个python敲击木鱼积累功德的小项目&#xff0c;当时纯粹就是写着玩&#xff0c;回顾一下鼠标事件的东西还记不记得&#xff0c;发现这个博客的点赞和收藏量还挺高的&#xff0c;我当时也没有把它当回事&#xff0c;后面也有很多人问怎…

11.11一些资源整理和总结

使用python读取tensorboard文件中的数据并写入到excel当中去能够代替Originlab的画图软件&#xff08;macos&#xff09;Mac款origin来了&#xff01;还不来看看&#xff01;ptflops&#xff1a;计算网络参数FLOPs的工具[github] 4 中方式计算 FLOPs&#xff08;知乎&#xff0…

栈和队列实现的思路和代码

栈和队列第一节----栈什么是栈实现栈的基本思路各个接口函数的实现初始化栈销毁栈压栈出栈返回栈顶元素栈的判空栈的大小第二节----队列什么是队列实现队列的基本思路各个接口函数的实现队列的初始化队列的销毁队列的插入队列的删除返回队头元素和队尾元素队列的判空队列的大小…

使用DESeq2进行转录组原始count标准化和差异分析

转录组测序完成后&#xff0c;一般我们会获得一个原始 read count表达矩阵&#xff0c;其中行是基因&#xff0c;列是样品。常用的差异分析工具包括limma、edgeR和DESeq2。DESeq2在测序领域使用最为广泛&#xff08;google scholar引用高达43284次&#xff0c;edgeR为28076次&a…

MYSQL索引查询问题质疑

前言 我们在写mysql查询语句的时候&#xff0c;尤其是经验不足的同学肯定会想要怎么使用索引加快查询&#xff0c;或是我这样写到底会不会命中索引。那么现在我就列举几个常见的索引查询问题进行简单说明一下。&#xff08;欢迎互怼&#xff01;&#xff09; 1.问&#xff1a…

小学生python游戏编程arcade----游戏界面按钮实现事件实现的三种方法

小学生python游戏编程arcade----游戏界面按钮实现事件实现的三种方法前言游戏界面按钮实现事件实现的三种方法1、按钮定义及事件3种方法1.1 按钮定义1.2三种事件引用方法1.2.1 类法1.2.2 事件方法2,自定义方法函数1.2.3 事件方法3,使用装饰器处理onclick事件1.3 效果图1.4 代码…

第十四届蓝桥杯校模拟赛详解+代码(一)

“须知少时凌云志&#xff0c;自许人间第一流” 鄙人11月八号有幸参加学校蓝桥杯校选拔赛&#xff0c;题型为5道填空题&#xff0c;5道编程题&#xff0c;总时间为4小时。奈何能力有限&#xff0c;只完成了5道填空和3道编程大题&#xff0c;现进行自省自纠&#xff0c;分享学习…