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

相关文章

SpringBoot整合OpenFeign的完整指南

《SpringBoot整合OpenFeign的完整指南》OpenFeign是由Netflix开发的一个声明式Web服务客户端,它使得编写HTTP客户端变得更加简单,本文为大家介绍了SpringBoot... 目录什么是OpenFeign环境准备创建 Spring Boot 项目添加依赖启用 OpenFeig

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取

SpringBoot多数据源配置完整指南

《SpringBoot多数据源配置完整指南》在复杂的企业应用中,经常需要连接多个数据库,SpringBoot提供了灵活的多数据源配置方式,以下是详细的实现方案,需要的朋友可以参考下... 目录一、基础多数据源配置1. 添加依赖2. 配置多个数据源3. 配置数据源Bean二、JPA多数据源配置1. 配置主数据

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

SpringBoot中配置Redis连接池的完整指南

《SpringBoot中配置Redis连接池的完整指南》这篇文章主要为大家详细介绍了SpringBoot中配置Redis连接池的完整指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以... 目录一、添加依赖二、配置 Redis 连接池三、测试 Redis 操作四、完整示例代码(一)pom.

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例