有关若依菜单管理的改造

导言:

  搞了个后端对接若依前端,对接菜单管理时候懵懵的就搞完了,也是搞了很久。记一下逻辑和要注意的东西,以后做想似的能有个改造思路。

逻辑:

主要是要把后端传过的数组列表做成类似

这样的,所以要转格式

后端传过来的数据:

const data = [{ id: 1, name: '根节点1', parentId: null },{ id: 2, name: '根节点2', parentId: null },{ id: 3, name: '子节点1-1', parentId: 1 },{ id: 4, name: '子节点1-2', parentId: 1 },{ id: 5, name: '子节点2-1', parentId: 2 },{ id: 6, name: '子节点1-1-1', parentId: 3 },{ id: 7, name: '子节点1-1-2', parentId: 3 }
];

转换成el-table要的

const tree = [{id: 1,name: '根节点1',parentId: null,children: [{id: 3,name: '子节点1-1',parentId: 1,children: [{ id: 6, name: '子节点1-1-1', parentId: 3 },{ id: 7, name: '子节点1-1-2', parentId: 3 }]},{ id: 4, name: '子节点1-2', parentId: 1 }]},{id: 2,name: '根节点2',parentId: null,children: [{ id: 5, name: '子节点2-1', parentId: 2 }]}
];

若依是定义了一个方法来实现转换的过程,大致思路:

  • 第一次循环用于建立节点之间的父子关系映射。
  • 第二次循环用于识别根节点并初始化树的结构。
  • 第三次循环则利用递归构建完整的树形结构,确保所有节点的层级关系正确。

讲实话我还是懵懵的,模糊理解

1.把扁平数组每个数据看成点,两点之间连线

2.分别把两点连线是父节点的一端找到

3.对应接起来

没什么实感..

实现

1.index.vue

请求后端,获得数据,调用handleTree转换格式,绑到表格上

/** 查询菜单列表 */getList() {this.loading = true;listMenu(this.queryParams).then(response => {console.log("请求信息response:",response);this.menuList = this.handleTree(response.data, "id","parentUID");console.log("请求信息this.menuList:",this.menuList);this.loading = false;});},

2.handleTree()转换

在src\utils\ruoyi.js里.

把扁平化的数组数据结构(通常是包含父子关系的节点)转换为一个树形结构

/*** 构造树型结构数据* @param {*} data 数据源           // 输入的原始数据,是一个扁平结构的数组* @param {*} id id字段 默认 'id'   // 数据中表示唯一标识符的字段名,默认为 'id'* @param {*} parentId 父节点字段 默认 'parentId'  // 数据中表示父节点的字段名,默认为 'parentId'* @param {*} children 孩子节点字段 默认 'children'  // 用来存储子节点的字段名,默认为 'children'*/
export function handleTree(data, id = 'id', parentId = 'parentId', children = 'children') {// 配置对象,定义了 id 字段、parentId 字段、children 字段的名称let config = {id: id || 'id',                      // id 标识字段,默认为 'id'  parentId: parentId || 'parentId',     // 父节点标识字段,默认为 'parentId'childrenList: children || 'children'  // 子节点列表字段,默认为 'children'};// 存储每个父节点对应的子节点数组var childrenListMap = {}; // 存储所有节点的 id 及其节点对象,用于快速查找var nodeIds = {};  // 最终的树形结构数组,存储根节点var tree = [];// 第一次循环:构建 childrenListMap 和 nodeIdsfor (let d of data) {let parentId = d[config.parentId];    // 获取当前节点的父节点 idif (childrenListMap[parentId] == null) {childrenListMap[parentId] = [];     // 如果该父节点还没有子节点数组,则初始化}nodeIds[d[config.id]] = d;            // 保存当前节点的 id 和节点本身,方便快速查找childrenListMap[parentId].push(d);     // 将当前节点加入到其父节点对应的子节点数组中}// 第二次循环:找出根节点,并添加到 tree 数组中for (let d of data) {let parentId = d[config.parentId];     // 获取当前节点的父节点 idif (nodeIds[parentId] == null ) {       // 如果当前节点的父节点不存在,说明它是根节点tree.push(d);                        // 将根节点加入到树结构中}}// 第三次循环:递归遍历根节点的子节点,并构造完整的树形结构for (let t of tree) {adaptToChildrenList(t);                // 递归处理每个根节点,生成其子节点结构}/*** 递归地将子节点添加到对应的父节点中* @param {*} o 当前正在处理的节点对象*/function adaptToChildrenList(o) {if (childrenListMap[o[config.id]] !== null) {o[config.childrenList] = childrenListMap[o[config.id]];   // 将子节点数组添加到当前节点的 children 字段}if (o[config.childrenList]) {                               // 如果当前节点有子节点for (let c of o[config.childrenList]) {adaptToChildrenList(c);                                 // 递归处理每个子节点}}}// 返回最终构造好的树形结构return tree;
}

注意的点

1.handleTree()

这方法开始定义了config对象,其中把每个字段的父节点id,子节点的名字都规范好了,如果后端这俩传来的不一样的话在调用handleTree()时对应传过去就行,不然不一样用了默认的话会报错。

2.后端数据

后端传过来的每条数据都应该带上parentId字段,不管有没有,不然也会报错

3.el-table绑定

绑定的是本身的id,不是父节点的,绑父节点的会报键重复

<el-tablev-if="refreshTable"v-loading="loading":data="menuList"row-key="id":default-expand-all="isExpandAll":tree-props="{children: 'children', hasChildren: 'hasChildren'}">


 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git工具指令

下面是常用的Git命令清单&#xff0c;几个专用名称的译名如下&#xff1a; Workspace &#xff1a;工作区 Index /Stage&#xff1a;暂存区 Repository&#xff1a;仓库区&#xff08;或本地仓库&#xff09; Remote&#xff1a;远程仓库新建代码库 在当前目录新建一个Git代…

如何在银河麒麟操作系统中查看内存页大小

如何在银河麒麟操作系统中查看内存页大小 1、操作步骤2、注意事项 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在操作系统中&#xff0c;内存页大小&#xff08;Page Size&#xff09;是一个重要的概念&#xff0c;它决定了操作系统如何…

GPT理论

1.GPT发展 Transformer是一个用作翻译任务的模型&#xff0c;谷歌出品。 GPT全称 lmproving Language Understanding by Generative Pre-Training&#xff0c;用预训练语言理解模型。OPENAI出品。 BERT全称Pre-training of Deep BidirectionalTransformers for Language Unde…

深度学习反向传播-过程举例

深度学习中&#xff0c;一般的参数更新方式都是梯度下降法&#xff0c;在使用梯度下降法时&#xff0c;涉及到梯度反向传播的过程&#xff0c;那么在反向传播过程中梯度到底是怎么传递的&#xff1f;结合自己最近的一点理解&#xff0c;下面举个例子简单说明&#xff01; 一、…

828华为云征文|部署个人知识管理系统 SiyuanNote

828华为云征文&#xff5c;部署个人知识管理系统 SiyuanNote 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 SiyuanNote3.1 SiyuanNote 介绍3.2 SiyuanNote 部署3.3 Siyua…

WebSocket实现在线聊天室

项目实现源码&#xff1a; 前端源码 后端源码 1.常见的消息推送方式 1.1 轮询 1.1.1 轮询的概念 客户端以固定的事件间隔&#xff08;例如每秒或几分钟&#xff09;向服务器发送HTTP请求&#xff0c;服务器收到请求后&#xff0c;处理请求并返回数据给客户端 轮询具体实现htt…

element-plus中日历组件设置起始为周一

问题描述 element-plus中的日历组件默认是周日到周六&#xff0c;因业务需求&#xff0c;需要实现从周一到周日的顺序。 解决方式 引入dayjs及本地语言包&#xff0c;使用本地时区即可。 import dayjs from dayjs import dayjs/locale/zh-cn ... // 这一句是为了让日历使用本地…

Android 利用OSMdroid开发GIS

1、地址 Github地址&#xff1a;https://gitee.com/mirrors/osmdroid Git地址&#xff1a; GitCode - 全球开发者的开源社区,开源代码托管平台 Git下载包地址&#xff1a;Releases osmdroid/osmdroid GitHub 新建项目 osmdroid在线&#xff1a; &#xff08;1&#xff09…

基于Hive和Hadoop的图书分析系统

本项目是一个基于大数据技术的图书分析系统&#xff0c;旨在为用户提供全面的图书信息和深入的图书销售及阅读行为分析。系统采用 Hadoop 平台进行大规模数据存储和处理&#xff0c;利用 MapReduce 进行数据分析和处理&#xff0c;通过 Sqoop 实现数据的导入导出&#xff0c;以…

基于SSM+微信小程序的校园二手数码交易平台系统(二手3)(源码+sql脚本+视频导入教程+文档)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于ssm微信小程序的校园二手数码交易平台满足了不同用户的功能需求&#xff0c;包括用户、卖家以及管理员&#xff0c;下面对这不同用户的功能需求进行简介。 &#xff08;1&#xff09…

正点原子——DS100示波器操作手册

目录 基础按键&#xff1a; 快捷键 主界面&#xff1a; 垂直设置&#xff1a; 通道设置&#xff1a; 探头比列&#xff1a; 垂直档位&#xff1a; 垂直偏移&#xff1a; 幅度单位&#xff1a; 水平设置&#xff1a; 触发方式&#xff1a; 测量和运算: 光标测量&am…

队列及笔试题

队列 先进先出 使用单链表进行队尾插入 队头删除 其中带头结点直接尾插&#xff0c;不带头结点第一次操作要判断一下 但是带头结点需要malloc和free 函数传需要修改的参数方法 1、二级指针 2、带哨兵位的头结点 3、返回值 4、如果有多个值&#xff0c;用结构体封装起来…

深入解析Debian与Ubuntu:技术特点与用户使用指南

深入解析Debian与Ubuntu&#xff1a;技术特点与用户使用指南 引言 Debian和Ubuntu作为两大知名的Linux发行版&#xff0c;不仅在历史和理念上有所不同&#xff0c;在技术特点和用户使用方法上也各具特色。本文将深入解析它们的技术特点&#xff0c;并提供用户使用指南&#x…

GB/T28181规范解读和技术实现

GB/T28181发展历程 GB/T28181-2011&#xff1a; 提出与起草&#xff1a;由公安部科技信息化局提出&#xff0c;全国安全防范报警系统标准化技术委员会&#xff08;SAC/TC100&#xff09;归口&#xff0c;公安部一所等多家单位共同起草。发布与实施&#xff1a;2012 年 6 月 1 …

timedatectl命令:告别时间烦恼,一键同步系统时间

一、命令简介 ​timedatectl​ 命令用于查看和设置系统的时间和日期&#xff0c;以及配置时区和 NTP&#xff08;Network Time Protocol&#xff09;设置。 相关命令&#xff1a;cal ​显示日历、 date ​查看、设置日期 ‍ 二、命令参数 格式&#xff1a; timedatectl […

Linux基础(一):计算机组成

整体构成 五个部分&#xff1a;CPU、输入、输出、内存、硬盘 1.CPU 1.1CPU指令集 CPU内部包含一些微指令&#xff0c;包含两种——精简指令集&#xff08;Reduced Insruction Set Computer, RISC&#xff09;和复杂指令集&#xff08;Complex Instruction Set Computer, CIS…

基于ASRPRO的语音应答

做这个的起因是为了送女朋友&#xff0c;而且这东西本身很简单&#xff0c;所以在闲暇之余尝试了一下。 这个工程很简单&#xff0c;只通过对ASRPRO进行编程即可。 先看效果。&#xff08;没有展示所有效果&#xff0c;后续会列出来所有对话触发&#xff09; 语音助手示例1 语音…

全网最适合入门的面向对象编程教程:54 Python字符串与序列化-字符串格式化与format方法

全网最适合入门的面向对象编程教程&#xff1a;54 Python 字符串与序列化-字符串格式化与 format 方法 摘要&#xff1a; 在 Python 中&#xff0c;字符串格式化是将变量插入到字符串中的一种方式&#xff0c;Python 提供了多种字符串格式化的方法&#xff0c;包括旧式的 % 格…

解决iPhone无法有效响应问题的指南

当您触摸、滑动和点击屏幕时&#xff0c;iPhone 没有响应或屏幕冻结是很烦人的。不可否认&#xff0c;iPhone 是最好的智能手机之一&#xff0c;但它并不完美。触摸屏冻结是 iPhone 用户面临的最常见问题之一。 好消息是&#xff0c;这个问题通常是由软件错误而不是硬件损坏引…

MySQL的增删查改(基础)一

一.增 方式1&#xff08;简写插入&#xff09;&#xff1a; 语法&#xff1a;insert into 表名 values&#xff08;值&#xff0c;值&#xff0c;值……&#xff09;; 这里insert into 代表要插入一条新数据行&#xff0c;values后面就是该行的值&#xff0c;其中后面的值的…