js菜单树子节点展示菜单完整路径信息

2024-01-29 18:30

本文主要是介绍js菜单树子节点展示菜单完整路径信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需求场景:在树形菜单中,仅子节点展示当前菜单完整路径信息(即拼接所有的父级菜单和自身),根节点和叶子节点不展示。子节点,在树结构中,除了根节点和叶子节点外的所有节点。

图文描述:

如图中,在不涉及 子节点展示菜单完整路径信息时,菜单树每个选择项都是单个描述,如顶级菜单根节点名称Parent, 子节点名称Child, 叶子节点Grand Child。为明晰展示菜单所处位置,虽然这样展示已经够明晰了,但总有些ui有些奇怪的想法,需要在子节点上展示父节点信息,来体现层次。为此,就有了红色字体标注部分。

定义已知的条件:

每一个节点都对应一条菜单信息数据,字段信息为:

{id: xxx, menuName: xxx, children: [], pmenuId: xxx, pmenuName: xxx,label: xxx}, 其中label字段是el-tree组件展示时所采用的key,该字段值默认与menuName一致,对于子节点时,需要重新设置值。

菜单树数据集>>

treeMenuList,如使用elementui前端框架中的el-tree组件来实现,该treeMenuList就是该组件需要的数据结构。

数据库查询出的菜单信息列表>>

arrAllMenu,包含了菜单树所有节点所涉及的菜单信息,只不过该列表是已经去树形结构了,简单便于遍历与补植。当然,也可以将treeMenuList递归平衡化得到一份儿简单的列表数据。

处理思路:

普遍思路采用递归,然后按顺序组装数据。

1、递归遍历菜单树数据集treeMenuList,获取里面涉及到的子节点集合arrChildNode。

2、forEach循环遍历arrChildNode,递归获取每一个子节点的全部父节点,并拼接父节点菜单信息。

3、递归遍历菜单树数据集treeMenuList,结合步骤2填充了父节点层次信息的子节点集合,重新设置子节点的label值。

相关代码:

// 处理子节点显示父级菜单名称追加相关方法  ==========================begin==================
// 子节点:在树结构中,除了根节点和叶子节点外的所有节点。
// 每个节点均是一个菜单信息 {id: xxx, menuName: xxx, children: [], pmenuId: xxx, pmenuName: xxx}
/*** 获取指定父节点的子节点.* @param parentNode 父节点* @param arrChildNode 子节点列表*/
export function getAllChildNode(parentNode, arrChildNode) {if (parentNode.children && parentNode.children.length > 0) {//有下级,是一个数组let children = parentNode.children;children.forEach(node => {if (node.children && node.children.length > 0) {//此时node有下级,因此node是子节点arrChildNode.push(node);//当前节点作为父节点, 递归遍历getAllChildNode(node, arrChildNode);}});}
}/*** 获取指定子节点的所有父节点.(深度由大到小)* @param childNode 子节点* @param arrParentNode 父节点列表* @param arrAllMenu 所有菜单信息列表*/
export function getAllParentNode(childNode, arrParentNode, arrAllMenu) {let pId = childNode.pmenuId;let parentNode = arrAllMenu.find(menu => {return menu.id === pId;});if (parentNode) {arrParentNode.push(parentNode);if (parentNode.pmenuId) {//如果还存在父级,就将当前父级作为子级,递归遍历getAllParentNode(parentNode, arrParentNode, arrAllMenu);}}
}/*** 获取树形菜单列表中子节点标签填充了父级信息后的子节点列表.* @param treeMenuList 树形菜单列表* @param arrAllMenu 所有菜单信息列表*/
export function getFilledChildNodeLabelAboutParentInfo(treeMenuList, arrAllMenu) {//菜单树中的子节点列表let arrChildNode = [];if (treeMenuList && treeMenuList.length > 0) {//遍历一级菜单,均视为父节点treeMenuList.forEach(item => {getAllChildNode(item, arrChildNode);});console.log('菜单树列表中的子节点信息:', arrChildNode);if (arrChildNode.length > 0) {arrChildNode.forEach(childItem => {//当前子节点的所有父节点列表,深度由大到小let arrCurrentParentNode = []; getAllParentNode(childItem, arrCurrentParentNode, arrAllMenu);//倒序一下,深度由小到大arrCurrentParentNode.reverse();let itemLable = '';//拼接父级菜单名arrCurrentParentNode.forEach(item => {itemLable = itemLable + item.menuName + '/';});//拼接自己itemLable = itemLable + childItem.menuName;//重新设置el-tree中的显示标签信息childItem.label = itemLable;});}console.log('菜单树列表中的子节点填充父级信息后:', arrChildNode);}return arrChildNode;
}/*** 填充树形菜单列表中子节点标签关于父级信息.* @param treeMenuList 树形菜单列表* @param arrChildNode 填充了父级信息的子节点平衡列表*/
export function fillTreeMenuChildNodeLabelAboutParentInfo(treeMenuList, arrChildNode) {//获取填充了父级信息的子节点平衡列表if (arrChildNode.length > 0) {//遍历treeMenuList.forEach(item => {let itemId = item.id;let needFillItem = arrChildNode.find(node => {return node.id === itemId;});if (needFillItem) {//存在,则设置值item.label = needFillItem.label;}if (item.children && item.children.length > 0) {//当前子级作为treeList继续遍历fillTreeMenuChildNodeLabelAboutParentInfo(item.children, arrChildNode);}});}
}/*** 填充菜单树中标签父级信息入口方法.* @param treeMenuList 树形菜单列表* @param arrAllMenu 所有菜单信息列表*/
export function fillTreeMenuLabelAboutParentInfoMain(treeMenuList, arrAllMenu) {let arrChildNode = getFilledChildNodeLabelAboutParentInfo(treeMenuList, arrAllMenu);fillTreeMenuChildNodeLabelAboutParentInfo(treeMenuList, arrChildNode);
}// 处理子节点显示父级菜单名称追加相关方法  ==========================end==================

页面调用处理是,只需要调用fillTreeMenuLabelAboutParentInfoMain即可。

这篇关于js菜单树子节点展示菜单完整路径信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/657798

相关文章

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Spring Security中用户名和密码的验证完整流程

《SpringSecurity中用户名和密码的验证完整流程》本文给大家介绍SpringSecurity中用户名和密码的验证完整流程,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 首先创建了一个UsernamePasswordAuthenticationTChina编程oken对象,这是S

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

SpringBoot集成LiteFlow工作流引擎的完整指南

《SpringBoot集成LiteFlow工作流引擎的完整指南》LiteFlow作为一款国产轻量级规则引擎/流程引擎,以其零学习成本、高可扩展性和极致性能成为微服务架构下的理想选择,本文将详细讲解Sp... 目录一、LiteFlow核心优势二、SpringBoot集成实战三、高级特性应用1. 异步并行执行2

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型

SpringBoot3中使用虚拟线程的完整步骤

《SpringBoot3中使用虚拟线程的完整步骤》在SpringBoot3中使用Java21+的虚拟线程(VirtualThreads)可以显著提升I/O密集型应用的并发能力,这篇文章为大家介绍了详细... 目录1. 环境准备2. 配置虚拟线程方式一:全局启用虚拟线程(Tomcat/Jetty)方式二:异步

Python远程控制MySQL的完整指南

《Python远程控制MySQL的完整指南》MySQL是最流行的关系型数据库之一,Python通过多种方式可以与MySQL进行交互,下面小编就为大家详细介绍一下Python操作MySQL的常用方法和最... 目录1. 准备工作2. 连接mysql数据库使用mysql-connector使用PyMySQL3.