ElementUi el-tree动态加载节点数据 load方法触发机制

需求背景:需要根据点击后获取的数据动态渲染一个 el-tree,同时渲染出来的 el-tree,需要点击节点时才能获取该节点的层数的获取,如图所示,我需要点击“组”节点才能渲染“设备列表”树,同时“设备列表”树的节点,在我点击具体节点时才能获取具体层数,也就是获取点击节点的数据

请添加图片描述
源代码:

/** html */
<el-dialog :title="dialog.title" v-model="dialog.visible" width="1200px" append-to-body><el-row :gutter="10"><el-col :span="4"><el-card shadow="hover"><template #header>组:</template><el-tree class="mt-2" ref="deptTreeRef" node-key="id" :current-node-key="groupId":data="instanceGroupTreeOptions" :props="{ label: 'label', children: 'children' }":expand-on-click-node="false" highlight-current default-expand-all@node-click="handleNodeClickWithGroup"><template #default="{ node, data }"><span class="custom-tree-node"><span><el-tooltip :show-after="300" :content="data.label" placement="top-start"><span> {{ ellipsis(data.label, 6) }} </span></el-tooltip></span></span></template></el-tree></el-card></el-col><el-col :span="4"><el-card shadow="hover"><template #header>设备列表:</template><el-tree class="mt-2" ref="deptTreeRef" :load="loadNode":props="{ label: 'name', children: 'children', isLeaf: 'leaf' }" lazy:expand-on-click-node="false" @node-click="handleNodeClickWithInstance"><template #default="{ node, data }"><span class="custom-tree-node"><span><el-tooltip :show-after="300" :content="data.name" placement="top-start"><span> {{ ellipsis(data.name, 6) }} </span></el-tooltip></span></span></template></el-tree></el-card></el-col></el-row></el-dialog>/** js */
import type Node from 'element-plus/es/components/tree/src/model/node'
interface Tree {name: string,leaf?: boolean
}const dialog = reactive<DialogOption>({visible: false,title: '点位选择框'
});
const instanceGroupTreeOptions = ref<InstanceGroupTreeVO[]>([]); //组tree data
const node_had = ref<any>() //存储 loadNode 函数中接受的变量
const resolve_had = ref<any>() //存储 loadNode 函数中接受的变量/** 查询实例组树 */
const getInstanceGroupTree = async () => {const res = await treeInstanceGroup(null);instanceGroupTreeOptions.value = res.data;
};/** 查询设备实例列表 */
const getListInstance = async (query: InstanceQuery) => {const resData = await listInstance(query);instanceList.value = resData.rows;instanceList.value.forEach(item => {item.name = `${item.name}(${item.type})`})console.log(instanceList.value)
};/** 点击 组 树形节点 */
const handleNodeClickWithGroup = async (node: any) => {await getListInstance({projectId: projectId.value,groupId: node.id as string})//点击 组节点后 通过getListInstance 获取 instanceList(第一层设备列表数据) 渲染设备列表树requestNewData()
}/** 动态加载节点数据函数 */
const loadNode = (node: Node, resolve: (data: Tree[]) => void) => {console.log(node)//第一步 当node.level 为0时 先存储函数接收的两个变量//此处的node.level 为0时 表示的是初始化的节点数据 也就是点击了组节点之后展示的第一层设备列表树的数据 也就是根节点 并不显示在树上if (node.level === 0) {//这里将函数接收的两个参数存储起来是将 loadNode手动触发的关键node_had.value = node //此处的node 也可以理解为根节点(看不见)resolve_had.value = resolve //这里的resolve是根节点的 resolvereturn resolve(instanceList.value) //instanceList 就是点击了组节点之后获取的第一层 设备列表的数据}//当需要加载节点数据的node type 为bms时 通过接口获取节点数据/** 这里再说明一下 点击第一层节点后 渲染的数据还是会调用 loadNode 方法 只不过此时不会走 if (node.level === 0) 这个条件 * 此时resolve和node 已经是当前需要加载数据的node 和 resolve*/if (node.data.type == 'bms') {//这段可以修改成你们自己的获取节点数据的接口setTimeout(() => {resolve(instanceList.value)}, 500)} else { //如果不是bms则为空 或者以后增加其他条件resolve([])}
}/** 获取节点数据 */
const requestNewData = () => {node_had.value.childNodes = []; //把存起来的node的子节点清空,不然会界面会出现重复树!这里清空的就是根节点下面的内容loadNode(node_had.value, resolve_had.value); //再次执行懒加载的方法
}onMounted(async () => {await getInstanceGroupTree();
});

关于方法的注释都写在代码片段里面了

大概讲一下,首先 loadNode 方法就是 “设备列表” el-tree 上的一个方法,在页面加载时,会立即调用一次,根据代码中的条件去渲染树,接着,点击 “组” 的树节点,触发“组”树节点点击函数,handleNodeClickWithGroup,根据点击的组节点获取对应的组下的设备列表数据,然后执行 requestNewData 函数 从而实现动态渲染,所以loadNode方法是可以手动触发的

另外再说一点,在loadNode中打印出来的node,当node.level == 0 时,我代码注释中所提到的 “根节点” 是我自己理解的意思 就是由这个 node 渲染出后续的子节点 并且这个 所谓的 “根节点” 并不是显示在页面上(不可见)

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

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

相关文章

war后门文件部署 什么是war后门文件 为什么要部署???看见war后门文件部署你知道????

在漏洞复现的时候做了一道war后门文件部署的&#xff0c;然后我们就要去了解什么是war包&#xff0c;然后这个漏洞实现要有什么情况&#xff1f;&#xff1f;为什么要进行部署&#xff1f;&#xff1f; war包在哪些地方可以实现&#xff1f;&#xff1f;&#xff1f; war是一种…

优设AI导航

1、优设AI导航 优设AI导航

数据结构与算法题目集(中文)6-2顺序表操作集

题目地址 https://pintia.cn/problem-sets/15/exam/problems/type/6?problemSetProblemId725&page0 注意审题&#xff0c;返回false的时候不要返回ERROR&#xff0c;否则答案错误&#xff0c;机器规则是死的。 位置一般指数组下标&#xff0c;位序一般指数组下标1。但是思…

[FreeRTOS 基础知识] 任务调度 与 链表

文章目录 任务并行的概念RTOS如何实现多任务调度&#xff1f; 任务并行的概念 在生活中&#xff0c;经常出现一心多用的情况。比如你需要一边吃饭一边手机回复信息&#xff0c;这里面就存在两个任务&#xff1a;任务一、吃饭。任务二、手机回复信息。 假如你无法一心多用&…

leetCode127. 单词接龙

leetCode127. 单词接龙 // bfs 剪枝 class Solution { public:int ladderLength(string beginWord, string endWord, vector<string>& wordList) {// 1.将所有的单词放在set字段中unordered_set<string> s;for (auto & ele : wordList) s.insert(ele);//…

hw meta10 adb back up DCIM

1. centos install adb 2. HW enable devlepment mode & enalbe adb debug 3. add shell root/zt/adb-sync python3 ./adb-sync --reverse /sdcard/DCIM/Camera /root/zt/meta10

前端技术入门指南

引言 在数字化时代&#xff0c;前端开发成为了连接用户与数字世界的重要桥梁。无论你是对编程充满好奇的新手&#xff0c;还是想要拓展自己技能领域的在职人员&#xff0c;前端开发都是一个值得学习和探索的领域。本文将带你走进前端技术的世界&#xff0c;为你提供一个入门指…

git 创建分支,将分支合并到master分支上

git 创建分支 要在Git中创建一个新分支并且复制master分支的内容&#xff0c;同时保留master分支&#xff0c;你可以先切换到master分支&#xff0c;然后创建并切换到新分支&#xff0c;最后将master分支的内容复制到新分支。以下是相应的命令&#xff1a; git checkout mast…

Maven简单介绍

Maven 是一个项目管理和构建工具&#xff0c;主要用于 Java 项目。它帮助开发者自动化管理项目的依赖、构建过程、报告生成等任务。下面是关于 Maven 的一些基本信息&#xff0c;以及如何在本地设置和在 IDE&#xff08;如 IntelliJ IDEA&#xff09;中配置 Maven 的步骤。 什…

【Modelground】个人AI产品MVP迭代平台(5)——神投手(实时投篮检测游戏)

文章目录 介绍篮框识别进球算法离屏渲染总结 介绍 神投手是我开发的一款移动端web实时投篮检测游戏。其解决的痛点是&#xff1a;专为投篮训练而生的&#xff0c;有手机就能玩的投篮计数游戏。我本人是一个篮球爱好者&#xff0c;特点就是投篮准&#xff0c;虽然投篮挺靠天赋&…

第二十一节:带你梳理Vue2: 父组件使用子组件时的修饰符和双向数据绑定

1. 原生事件修饰符.native 1.1. 关于组件标签上的事件 在组件标签上是没办法触发原生的js事件的,vue会将其作为自定义事件处理 示例代码如下: <div id"app"><!-- 使用组件 --><!-- 组件标签上使用DOM元素原生事件不会触发, --><my-compone…

DevExpress WPF中文教程:Grid - 如何向项目添加GridControl并绑定到数据

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

第十二届蓝桥杯单片机国赛练习代码

文章目录 前言一、问题重述二、主函数总结 前言 第十五蓝桥杯国赛落幕已有十天&#xff0c;是时候总结一下&#xff0c;这个专栏也将结束。虽然并没有取得预期的结果&#xff0c;但故事结尾并不总是美满的。下面是赛前练习的第十二届国赛的代码。 一、问题重述 二、主函数 完整…

大数据快速使用Kerberos认证集群

一、创建安全集群并登录其Manager 创建安全集群&#xff0c;开启“Kerberos认证“参数开关&#xff0c;并配置“密码“、“确认密码“参数。该密码用于登录Manager&#xff0c;请妥善保管。 登录MRS管理控制台页面。 单击“集群列表“&#xff0c;在“现有集群“列表&#xf…

虚拟机调用摄像头设备一直 select timeout问题的解决

在VMware里面调用v4l2-ctl捕获图像&#xff0c;或者opencv的VideoCapture(0)捕获图像&#xff0c;或者直接调用v4l2的函数&#xff0c;在streamon后&#xff0c;调用select读取数据&#xff0c;均会一直提示select timeout的问题&#xff0c;大概率是由于USB版本的兼容性造成的…

fs.1.10 ON rockylinux8 docker镜像制作

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 rockylinux docker上编译安装fs1.10版本的流程记录。 环境 docker engine&#xff1a;Version 24.0.6 rockylinux docker&#xff1a;8 freeswitch&#xff1a;v1.10.7 手动模式 rockylinux准备 docker hub拉取r…

MySql一条查询语句的执行流程是怎么样的?

MySql一条查询语句的执行流程是怎么样的&#xff1f; 1.前言 一条sql语句到底在执行时经历了什么&#xff1f;探究这个问题是学习mysql的重要步骤&#xff0c;面试时常被问到&#xff0c;也使得学习mysql时也有了知识框架的支撑&#xff0c;明白我们背的知识点到底用在哪里&a…

为什么要进行渗透测试?

渗透测试的重要性 渗透测试是一种安全评估技术&#xff0c;旨在模拟黑客攻击&#xff0c;发现和利用系统漏洞&#xff0c;以评估企业信息系统的安全性。以下是进行渗透测试的几个主要原因&#xff1a; 1.发现潜在的漏洞和安全风险&#xff1a;渗透测试可以模拟真实的攻击行为…

AI智能体做高考志愿填报分析

关注公众号&#xff0c;赠送AI/Python/Linux资料&#xff0c;对AI智能体有兴趣的朋友也可以添加一起交流 高考正在进行时&#xff0c;学生焦虑考试&#xff0c;家长们焦虑的则是高考志愿怎么填。毕竟一个好的学校&#xff0c;好的专业是进入社会的第一个敲门砖 你看张雪峰老师…

2024.6.10学习记录

1、代码随想录二刷 2、项目难点 review 3、计组复习