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是根节点的 resolve
        return 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 渲染出后续的子节点 并且这个 所谓的 “根节点” 并不是显示在页面上(不可见)

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

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

相关文章

企业数据安全管理容易忽视的关键点:云存储权限管控

云存储已经广泛应用于企业用户、教育领域、医疗领域以及政府和公共服务部门。具体应用场景包括文件共享、数据备份、在线课程、教学资源库、电子病历、医学影像、实验室数据、政务数据的集中管理和共享等。 云存储的优势非常明显&#xff1a; 可扩展性&#xff1a;云存储空间可…

Message forwarding mechanism (消息转发机制)

iOS的消息转发机制 iOS的消息转发机制是在消息发送给对象时&#xff0c;找不到对应的实例方法的情况下启动的。消息转发允许对象在运行时处理无法识别的消息&#xff0c;提供了一种动态的、灵活的消息处理方式。 消息转发机制主要分为三个阶段&#xff1a; 动态方法解析快速…

深度神经网络——什么是 CNN(卷积神经网络)?

Facebook和Instagram自动检测图像中的面孔&#xff0c;Google通过上传照片搜索相似图片的功能&#xff0c;这些都是计算机视觉技术的实例&#xff0c;它们背后的核心技术是卷积神经网络&#xff08;CNN&#xff09;。那么&#xff0c;CNN究竟是什么呢&#xff1f;接下来&#x…

通过 .NET COM 互操作设置 System.Drawing.Color

1. 问题背景 在尝试使用 Aspose.Words 库执行 COM 互操作时&#xff0c;遇到了一个关键问题&#xff1a;无法设置颜色。理论上&#xff0c;可以通过向 DocumentBuilder.Font.Color 赋值来设置颜色&#xff0c;但尝试时却出现了 OLE 错误 0x80131509。 以下代码示例演示了这个…

el-tabel名称排序问题

el-tabel排序 最终实现功能如下&#xff1a; 排序限制为&#xff1a; 文件夹>普通文件 数字&#xff08;0->9&#xff09;->大写字母&#xff08;A->Z&#xff09;->小写字母&#xff08;a->z&#xff09;->中文拼音&#xff08;a->z&#xff09; 正序…

8086 汇编笔记(七):数据处理的两个基本问题

一、bx、si、di 和 bp 在使用过程中有几处需要注意的地方&#xff1a; &#xff08;1&#xff09;在 8086CPU 中&#xff0c;只有这4个寄存器可以用在“[....]”中来进行内存单元的寻址。其他寄存器是不可以的&#xff0c;例如“mov bx, [ax]”就是错误的用法。 &#xff08…

C#中字节数组(byte[])末尾继续添加字节的示例

方法一&#xff1a;使用List 使用List可以很容易地在末尾添加字节&#xff0c;然后如果需要&#xff0c;可以将其转换回byte[]。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Lin…

【机器学习基础】Python编程02:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些…

展厅装修设计对于企业的关重要性

1、定位和主题 定位和主题与企业的品牌形象、产品和服务特点相一致&#xff0c;以展示企业形象和产品特点。 2、空间布局 在空间布局方面&#xff0c;采用分区展示、独立展示、开放式展示等方式&#xff0c;以便客户和观众浏览和参观。同时&#xff0c;合理利用&#xff0c;避免…

Android Lottie 体积优化实践:从 6.4 MB 降到 530 KB

一、说明 产品提出需求&#xff1a;用户有 8 个等级&#xff0c;每个等级对应一个奖牌动画。 按照常用的实现方式&#xff1a; 设计提供 8 个 lottie 动画&#xff08;8 个 json 文件&#xff09;。研发将 json 文件打包进入 APK 中。根据不同等级播放指定的动画。 每一个 …

Spring AI 第二讲 之 Chat Model API 第六节Google VertexAI API

VertexAI API 可提供高质量的定制机器学习模型&#xff0c;只需花费最少的机器学习专业知识和精力。 Spring AI 通过以下客户端提供与 VertexAI API 的集成&#xff1a; VertexAI Gemini Chat Vertex AI Gemini API 允许开发人员使用 Gemini 模型构建生成式人工智能应用程序。…

SpringMVC接收数据

SpringMVC接收数据 SpringMVC处理请求流程 SpringMVC涉及组件理解&#xff1a; DispatcherServlet : SpringMVC提供&#xff0c;我们需要使用web.xml配置使其生效&#xff0c;它是整个流程处理的核心&#xff0c;所有请求都经过它的处理和分发&#xff01;[ CEO ]HandlerMappi…

创新实训2024.06.03日志:完善Baseline Test框架、加入对Qwen-14B的测试

1. Baseline Test框架重构与完善 在之前的一篇博客中&#xff08;创新实训2024.05.29日志&#xff1a;评测数据集与baseline测试-CSDN博客&#xff09;&#xff0c;我介绍了我们对于大模型进行基线测试的一些基本想法和实现&#xff0c;包括一些基线测试的初步结果。 后来的一…

SpringCloud-面试篇(二十三)

&#xff08;1&#xff09;SpringCloud常见组件有那些 有无数微服务需要相互调用&#xff1a;可以用远程调用组件OpenFeign组件&#xff0c;也可以用Dobble 这么多微服务相互调用怎么管理&#xff1a;就用到注册中心组件Nacos&#xff0c;Eureka 所有的服务去找注册中心做注…

Ollama本地运行 Codestral-22B-v0.1

Ollama本地运行 Codestral-22B-v0.1 0. 引言1. 运行 codestral:22b-v0.1-q8_02. 简单测试下它的代码能力 0. 引言 Mixtral 5月30日发布了 Codestral-22B-v0.1。 Codestrall-22B-v0.1 在 80 多种编程语言的多样化数据集上进行训练&#xff0c;包括最流行的语言&#xff0c;例如…

vue实现pdf下载——html2canvas

html2canvas 官方文档https://html2canvas.hertzen.com/getting-started html2canvas 的原理是通过遍历DOM树,将每一个HTML元素转化为Canvas对象,并叠加到一起形成一张完整的图片或者PDF文件。 1. 安装插件 npm install html2canvas jspdf --save 2.使用&#xff08;页面已经…

月入30000的软件测试人员,简历是什么样子的?

我们都知道&#xff0c;简历是一个人进入职场的敲门砖。从某种层面来说&#xff0c;简历也像一个人的具象身份证&#xff0c;或者专业资格证。所以&#xff0c;一份简历的好坏&#xff0c;不仅关乎个人的“脸面”&#xff0c;更关乎你是不是一个有“含金量”的技术人员。 所以…

企业应用架构模式--详解51种企业应用架构模式

导读&#xff1a;企业应用包括哪些&#xff1f;它们又分别有哪些架构模式&#xff1f; 世界著名软件开发大师Martin Fowler给你答案 目录 01什么是企业应用02 企业应用的种类03企业架构模式 01什么是企业应用 我的职业生涯专注于企业应用&#xff0c;因此&#xff0c;这里所谈…

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

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

pyqt QAxWidget 读写Excel文件

QaxWidget相比openpyxl 的方式区别是提供了图形界面&#xff0c;excel的输入修改不用再编写代码&#xff0e;activeX技术是个过时的技术&#xff0c;发挥下余热&#xff0e; # -*- coding: utf-8 -*- from PyQt5.QAxContainer import QAxWidget from PyQt5.QtWidgets import …