vue2:树形控件el-tree中加载两种不同结构的数据

需求

需要在树形控件中逐级显示公司、部门以及不同部门下的项目信息。其中,公司及部门信息的结构是一致的,但是项目是另一种结构(类)。所以,树结构中需要用到两种不同结构的数据。

El-tree

主要属性

下面是一个el-tree控件,包含了其中主要的属性

<el-tree:data="projectOptions"     //树形图所绑定的数据:props="defaultTreeProps"  //配置选项,共四项,见下文:expand-on-click-node="false":filter-node-method="filterNode":default-expanded-keys="defaultShowNodes" //树形控件展开节点,是一个数组,从根节点到叶子节点:current-node-key="currentNodeKey":load="loadTreeNode"      //lazy模式下,点击节点前的小三角时触发,加载该节点数据数据ref="tree"lazy                         //懒加载,即点击节点前的小三角时才开始加载(获取)数据:highlight-current="true"@node-click="handleNodeClick"    //点击节点所要处理的业务逻辑style="max-height:calc(100vh - 180px); overflow:auto;"/>

配置选项props

defaultTreeProps: {children: 'children',label: 'deptName',                  isLeaf: 'leaf'
},

Label

节点标签,即每个节点所显示的字符,可以直接指定一个字符串,表示节点对象的某个属性值,比如上面例子中'deptName'表示结果数据中的deptName字段(部门名称)作为树形控件的label。

但是,因为我的树形图最后的叶子节点是项目,里面是没有deptName字段的,我希望叶子节点显示项目名称,所以,我就需要用一个方法来动态控制label的值:在前面的节点使用deptName,最后的叶子节点使用projectName,如下,我是通过返回的数据中是否有deptName这个字段来判断的:

 label: function(data,node){if(data.deptName) return data.deptNameelse return data.projectName;
},

 isLeaf

lazy模式下,用于指定节点是否为叶子节点。

lazy模式下,在点击节点时才进行该层数据的获取,默认情况下 Tree 无法预知某个节点是否为叶子节点,所以会为每个节点添加一个下拉按钮,如果节点没有下层数据,则点击后下拉按钮会消失。但是,如果你获取数据时就知道这个节点是否是叶子节点,也可以提前告知 Tree ,从而避免在叶子节点前渲染不必要的下拉按钮。比如最开始的示例中,isLeaf: 'leaf'表示使用节点对象中的leaf属性来告知Tree是否是叶子节点(在部门实体类中有这么个数据项)。

但是,我要在最后一级部门节点下要加载项目信息,所以,不可以用部门对象中的leaf属性,这会导致在最后一级部门节点处没有小三角,无法点击,也就无法触发该节点的:load方法来加载项目数据。所以,我同样需要动态判定是否是leaf:这里我检查,如果数据中有projectName这个字段,也就是项目信息,它就是叶子节点,否则,非叶子节点。这里根据实际业务来选择判定方法。

isLeaf: function(data){if(data.projectName) return true;else return false;
}

小结

综上,prop中的选项,即可以直接指定使用节点对象中的某个属性来赋值,也可以使用一个函数来动态计算。函数中有data和node两个默认入参(具体可参考官网中el-tree页面关于prop的表格:Element - The world's most popular Vue UI framework)。

(初始化)数据加载 on load

根据实际业务需求,逐层加载数据,比如下面的代码,第一层加载公司信息,第二层和第三层分别加载部门数据,最后一层加载项目数据。

async loadTreeNode(node, resolve) {if (node.level === 0) {await this.getTreeRoot(node, resolve);}else if(node.level === 1 || node.level === 2){await this.getDeptList(node, resolve);}else{await this.getProjectList(node, resolve);}
},

下面是获取部门信息的示例,将返回值中的数据信息提取出来,赋给resolve返回。

getDeptList(node, resolve) {listDept({parentId: node.data.deptId}).then(res => {const {data} = res;    //提取res中的data部分resolve(data);});}
},

在JavaScript中,resolve是一个Promise对象的方法,用于返回一个已解析(resolved)的Promise对象。

Promise是一种用于处理异步操作的对象,它可以将异步操作封装为一个Promise对象,然后通过resolve方法将Promise对象状态设置为已解析(resolved),表示异步操作已成功完成。

resolve方法接受一个参数,该参数可以是任意类型的值,通常是一个表示异步操作的结果。当调用resolve方法时,Promise对象的状态将从pending变为fulfilled,然后通过.then方法执行与该Promise对象相关的成功回调函数。

需要注意的是,Promise对象的状态一旦被解析或拒绝(rejected)后,就不能再次改变。所以,在调用resolve方法后,Promise对象的状态将保持为已解析状态,而不能再变为未解析状态。

响应节点点击事件on node-click

这里可以定义当鼠标点击树形图中的某个节点时需要给出什么响应,共有三个参数:传递给 data 属性的数组中该节点所对应的对象、节点对应的 Node、节点组件本身。

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

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

相关文章

《ChatGPT:强大的人工智能聊天机器人》

《ChatGPT&#xff1a;强大的人工智能聊天机器人》 一、引言 在当今科技飞速发展的时代&#xff0c;人工智能已经成为了各个领域的热门话题。而 ChatGPT&#xff0c;作为一款强大的人工智能聊天机器人&#xff0c;自推出以来就引起了广泛的关注和热议。它不仅能够进行自然流畅的…

浅谈Spring Cloud:认识微服务

SpringCloud就是分布式微服务架构的一站式解决方案&#xff0c;是微服务架构落地的多种技术的集合。 目录 微服务远程调用 Eureka注册中心 搭建Eureka Server 注册组件 服务拉取 当各种各样的服务越来越多&#xff0c;拆分的也越来越细&#xff0c;此时就会出现一个服务集…

基于mockito做单元测试

1.简介 配合断言使用(杜绝System.out)可重复执行不依赖环境不会对数据产生影响Spring的上下文环境不是必备的一般都配合mock类框架对数据库进行隔离 mock类使用场景&#xff1a; 要进行测试的方法存在外部依赖(DB,Redis,第三方接口),为了专注于对该方法的逻辑进行测试&#…

计算机毕业设计 社区医疗服务系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

国产游戏技术能否引领全球【终稿】

国产游戏技术能否引领全球 摘要&#xff1a;近年来&#xff0c;国产游戏行业蓬勃发展&#xff0c;技术水平不断提升&#xff0c;多款作品在国际市场上崭露头角。从画面渲染到物理引擎&#xff0c;从AI技术到服务器架构&#xff0c;中国游戏开发者在各个领域都取得了显著进步。…

MySQL高阶1919-兴趣相同的朋友

题目 请写一段SQL查询获取到兴趣相同的朋友。用户 x 和 用户 y 是兴趣相同的朋友&#xff0c;需满足下述条件&#xff1a; 用户 x 和 y 是朋友&#xff0c;并且用户 x and y 在同一天内听过相同的歌曲&#xff0c;且数量大于等于三首. 结果表 无需排序 。注意&#xff1a;返…

常见排序(C语言版)

1.排序的概念及其应用 1.1排序的概念 排序&#xff1a;​ 在计算机科学与数学中&#xff0c;一个排序算法&#xff08;英语&#xff1a;Sorting algorithm&#xff09;是一种能将一串资料依照特定排序方式排列的算法。 稳定性&#xff1a;假定在待排序的记录序列中&#xff…

聚观早报 | 小米三折叠手机专利曝光;李斌谈合肥投资蔚来

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 9月20日消息 小米三折叠手机专利曝光 李斌谈合肥投资蔚来 索尼PS5 Pro包装亮相 新一代Spectacles AR眼镜发布 通…

三十种编程语言庆祝【国庆节】!!!

30种编程语言来打印“国庆节快乐”&#xff1a; 分别为&#xff1a; PythonJavaScriptJavaCCC#PHPRubySwiftGoRustKotlinScalaPerlRLuaDartTypeScriptBash (Shell)F#JuliaElixirHaskellGroovyVisual Basic .NETMATLABPowerShellSQLVBA (Visual Basic for Applications)COBOL …

《AI系统:原理与架构》于华为HC大会2024正式发布

2024年9月21日&#xff0c;《AI系统&#xff1a;原理与架构》新书发布会在上海世博馆华为HC大会顺利举办。本书由华为昇腾技术专家、B站AI科普博主ZOMI酱和哈工大软件学院副院长苏统华教授联合编写&#xff0c;是领域内AI系统方面填补空白的重磅之作。 发布会上&#xff0c;《A…

Spring:项目中的统一异常处理和自定义异常

介绍异常的处理方式。在项目中&#xff0c;都会进行自定义异常&#xff0c;并且都是需要配合统一结果返回进行使用。 1.背景引入 &#xff08;1&#xff09;背景介绍 为什么要处理异常&#xff1f;如果不处理项目中的异常信息&#xff0c;前端访问我们后端就是显示访问失败的…

【监控】【Nginx】使用 Zabbix 监控 Nginx,并使用 InfluxDB 存储数据的详细指南

目录 1. 安装 Zabbix Server步骤 1&#xff1a;安装 Zabbix 服务器步骤 2&#xff1a;安装 InfluxDB步骤 3&#xff1a;启动 InfluxDB 服务步骤 4&#xff1a;创建 InfluxDB 数据库步骤 5&#xff1a;配置 Zabbix Server步骤 6&#xff1a;启动 Zabbix 服务 2. 安装 Zabbix Age…

JavaScript发送邮件:实现前端触发的教程?

JavaScript发送邮件的方式&#xff1f;怎么使用JavaScript发信&#xff1f; 无论是用户反馈、联系表单还是自动通知&#xff0c;前端触发的邮件发送功能都能极大地提升用户体验。AokSend将详细介绍如何通过JavaScript发送邮件&#xff0c;实现前端触发的邮件发送功能。 JavaS…

Centos7安装chrome的问题

chrome是129版本的&#xff0c;很新。 启动chrome的时候报错&#xff1a;undefined symbol: ippvalidateattributes 这个没有报libxxx.so not found。 大概就是依赖的so库版本太低了&#xff0c;查了下这个函数在cups 重新拉了最新的代码并编译 ./configure --with-tlsno…

跨站请求伪造(CSRF)漏洞详解

免责申明 本文仅是用于学习检测自己搭建的DVWA靶场环境有关CSRF的原理和攻击实验,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《‌中华人民共和国网络安全法》‌及其所在国家地区相关法…

ubuntu24安装vivado24(安装并解决若干错误)

目录 安装方法&#xff1a;问题1&#xff1a;解决办法&#xff1a; 问题2&#xff1a;解决方法&#xff1a; 安装完成&#xff1a; 安装方法&#xff1a; 注意&#xff1a;内存最好预留80G空闲的。 安装好大小&#xff1a; 安装依赖库&#xff1a; sudo apt-get update sud…

计算机网络17——IM聊天系统——客户端核心处理类框架搭建

目的 拆开客户端和服务端&#xff0c;使用Qt实现客户端&#xff0c;VS实现服务端 Qt创建项目 Qt文件类型 .pro文件&#xff1a;配置文件&#xff0c;决定了哪些文件参与编译&#xff0c;怎样参与编译 .h .cpp .ui&#xff1a;画图文件 Qt编码方式 Qt使用utf-8作为编码方…

Java 8 和 MyBatis 框架实现每天凌晨 2 点进行增量缓存

以下是使用 Java 8 和 MyBatis 框架实现每天凌晨 2 点进行增量缓存的完整示例代码&#xff1a; Offering 实体类&#xff1a; public class Offering { private String id; private String name; private String size; private String type; // 构造方法、get…

堆栈指针寄存器SP的初值是多少?执行PUSH AX命令后,SP的值是多少?执行POP BX后,SP的值是多少?为什么答案给的是200,202,200。

欢迎来到我的技术博客&#xff01; &#x1f389; 这里不仅有满满的编程干货和学习资源&#xff0c;我的某站账号也为你准备了更多实用的技术视频和知识分享。 &#x1f449; 点击关注我的小破站账号&#xff0c;获取更多编程技巧和学习资源&#xff01; 小破站主页 例题 ST…

鸿蒙 WebView 如何 Debug

前置&#xff1a; hdc chrome //----------------------------------------------------------------------------------------------- hdc shell cat /proc/net/unix | grep devtools 0: 00000002 0 10000 1 1 81134005 webview_devtools_remote_62479exit执行&…