el-tree 懒加载数据,展开的节点与查询条件联动

news2025/1/19 3:15:16

目录

  • 效果描述
  • 实现原理
    • 步骤1:el-tree设置node-key
    • 步骤2:懒加载时对数据进行处理,给整个树形数据添加唯一值
    • 步骤3:(联动) 点击左侧树形结构,右侧对应查询框自动赋值
    • 步骤4:(联动) 右侧查询条件选择好后,点击查询,左侧树形结构自动展开对应节点
  • 总结

效果描述

项目某模块左侧为el-tree树形结构地市数据,右侧有地市查询条件及结果展示
要求:

  1. 点击左侧某地市进行查询时,右侧的地市查询输入框内同步进行赋值(如左侧点击成都,右侧地市查询输入框内,应该自动选中成都)
  2. 同理,右侧地市查询输入框 选中成都时,左侧树形结构成都节点自动展开

实现原理

步骤1:el-tree设置node-key

在这里插入图片描述
首先要知道node-key 是设置展开和选中的必要设置,其绑定的值是整个树唯一的(一般绑定 id 等),如果出现重复,会报错。同时设置展开某个节点时,如果这个节点的 id 存在重复,则会出现展开混乱的现象

备注:这里注意,可能在某些特殊时候,后台返回的树形数据,并不存在唯一值(比如我这里,绑定的字段 id ,但在数据里,存在部分数据 id 会一致的情况),这个时候要么是让后端将 id 处理成唯一值,要么就是我们自己对拿到的数据进行处理了(这里我是自己处理的)

步骤2:懒加载时对数据进行处理,给整个树形数据添加唯一值

因为数据量过大,我这里的el-tree用的是懒加载获取数据的方法(:load=“loadNode”)

<el-tree
  ref="tree"
  node-key="key"
  accordion
  @node-expand="nodeExpandFn"
  :filter-node-method="filterNode"
  :data="treeData"
  :default-expanded-keys="expanded"
  :props="defaultProps"
  :indent="0"
  lazy
  auto-expand-parent
  highlight-current
  :load="loadNode"
  @node-click="handleNodeClick"
>
</el-tree>

可以看到,node-key 我绑定的是 key 字段,这是我给数据中每个对象添加的唯一值:
loadNode方法中,在获取数据时添加唯一值,这里不用关注其他代码,只需关注我根据每个节点的特性,给每个节点对象都增加了一个 key 字段 (我这里第三级的节点数据,每个对象的id是相同的,这也是我选择增加 key 字段的原因)

loadNode(node, resolve) {
 if (node.level === 0) {
   this.resolve = resolve
   this.chooseNode = node
   queryKSHDeviceTree({ type: "0" }).then(res => {
     const treeData = [];
     res.resultValue.forEach(e => {
       e.key = e.id; // key ----------------------
       treeData.push(e);
     });
     resolve(treeData);
   });
 }
 else if (node.level === 1) {
   queryKSHDeviceTree({ type: '1' }).then(res => {
     let treeData = [];
     res.resultValue.forEach(e => {
       e.key = e.id; // key ------------------------
       treeData.push(e);
     });
     resolve(treeData);
   });
 } else if (node.level === 2) {
   queryKSHDeviceTree({ type: '2',pId: node.data.id }).then(res => {
     let treeData = [];
     res.resultValue.forEach(e => {
       // 这里根据当前对象自己的数据,拼出一个唯一值
       e.key = node.data.id + e.pId; // key --------------------
       treeData.push(e);
     });
     resolve(treeData);
   });
 }
}

步骤3:(联动) 点击左侧树形结构,右侧对应查询框自动赋值

这一步相对来说简单一些,在el-tree的点击事件 handleNodeClick 中进行操作

// 如果右侧查询框绑定的字段为 queryForm.cityId
// 点击第二级节点,对其他查询框赋值也同理
handleNodeClick(data, node) {
  if (data.label === "city") {
    this.queryForm.cityId = data.id;
  }
  else if ...
}

步骤4:(联动) 右侧查询条件选择好后,点击查询,左侧树形结构自动展开对应节点

这里 主要用到了 :default-expanded-keys=“expanded” (默认展开节点)
expanded 为 存放 key 值的数组

其实当整个树形数据完整,并且设置了 auto-expand-parent 
(展开子节点的时候自动展开父节点)的情况下,
这个时候expanded只用保存最后一级的key值即可

但是,由于我这里的数据是懒加载的,意味着虽然你右侧选了最后一级的数据,点击查询,
但我左侧的树形数据里,还并未加载子级数据,所以这个时候,
即时你将key存入expanded里,它找不到,所以也是没有用的

***所以这个时候,我们需要把每一级要展开的节点key字段都拿到,并存入expanded中
***这样,el-tree在自动展开某一节点时,它会根据懒加载方法,自动获取子节点的数据
***当子节点数据获取到后,它也会将每个节点的key自动去匹配expanded中的值,若存在相同的,
就会接着展开
!!!(简单的说,就是把每一级要展开的节点key字段都拿到,并存入expanded中,
同时懒加载方法写好,其他的交给el-tree自己就行)

经过测试,在展开节点后,对expanded重新赋值,已展开的节点不会自动关闭,所以这里也写了方法,先将el-tree所有的节点进行关闭

// 查询方法
queryClick() {
  let obj = {
    refName: 'tree2',
    cityId: this.queryForm.cityId,
    twoId: this.queryForm.twoId,
    threeId: this.queryForm.threeId || ''
  }
  this.treeNodeLinkage(obj);
}

// 查询条件和el-tree显示联动
// cityId 为第一级id,twoId 为第二级,threeId 为第三级
treeNodeLinkage({refName, cityId, twoId , threeId}) {
  // 先将el-tree所有节点关闭
  let nodesMap = this.$refs[refName].store.nodesMap; // 拿到全部的node
  for(let key in nodesMap) {
    nodesMap[key].expanded = false;
  }
  // 这里的第二级id,对应懒加载方法里 node.level === 2时候
  // 所以这里的newId拼接方法,按照当时key的拼接方法来
  let newId = cityId + twoId;
  this.expanded = [cityId, newId];
  if(threeId) {
    this.expanded.push(threeId);
  }
},

总结

其实这个联动,主要是搞懂el-tree的 node-keydefault-expanded-keys 属性就行。
简单来说,就是你想展开哪个节点,就把该节点node-key对应的字段放入default-expanded-keys对应的数组中。

其他的就是对数据的处理
把接口获取到的数据处理成你想要的样子,这是前端在很多时候都要做的事情

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

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

相关文章

AWS实例上本地部署ChatGLM2-6B

此篇博客主要介绍如何在AWS上创建带GPU的instance&#xff0c;并在instance上部署ChatGLM大模型。 AWS上申请带GPU的instance ChatGLM虽然也支持在CPU的instance上部署&#xff0c;但这里选择在GPU的instance上部署。所以&#xff0c;先在AWS上选择带GPU的instance。AWS上区分…

Python八连冠!它的资本到底是什么?带你详解Python的牛逼之处

Python 连续八年名列前茅 根据榜单显示&#xff0c;Python 不仅在“Spectrum”综合排名中保持第一的位置&#xff0c;而且远超第二名 Java。 对此&#xff0c;IEEE Spectrum 在发布编程语言榜单时写道&#xff0c;Python 主导地位的增强似乎在很大程度上是以牺牲较小、更专业…

华为云API人脸识别服务FRS的感知力—偷偷藏不住的你

云服务、API、SDK&#xff0c;调试&#xff0c;查看&#xff0c;我都行 阅读短文您可以学习到&#xff1a;人工智能AI人脸的识别、检测、搜索、比对 1、IntelliJ IDEA 之API插件介绍 API插件支持 VS Code IDE、IntelliJ IDEA等平台、以及华为云自研 CodeArts IDE&#xff0c;…

发送信息到我的眼镜上

很久很久以前&#xff0c;购得一个Vufine单目眼镜显示器&#xff0c;最近又拿它来折腾。 通过Pi4的连接&#xff0c;现在可以让任意的网友发送图文到眼镜上。 当然更理想的是通过PiZero2W再加上一个电源即可移动使用。 这里讲了实现的代码&#xff0c;总体也不太复杂。 发送…

ChatGLM2_6b安装

Chatglm2_6b安装 一、安装要求 1、硬件 能否使用,或者以什么模式使用主要取决于显卡的显存 2、能否使用AMD显卡? 可以,甚至可以使用CPU,但是需要降低精度。 以CPU模式运行大概需要32GB 内存。 二:工程与下载 官方路径工程路径: 一代工程: https://github.com/TH…

期权的具体操作步骤详解(期权盈利技巧)

做期权买卖首先我们要清楚在期权中有四个交易方向,分别是期权买方&#xff1a;认购做多&#xff0c;认沽做空&#xff0c;两者互为对手方&#xff0c;期权卖方&#xff0c;卖认购做空&#xff0c;卖认沽做多&#xff0c;只要我们明白了期权的方向即可判断做出选择&#xff0c;下…

算法 数据结构 斐波那契数列 递归实现斐波那契数列 斐波那契递归的优化 斐波那契数列递归求解 多路递归实现 斐波那契算法系列 数据结构(十一)

1. 什么是斐波那契数列&#xff1a; 之前的例子是每个递归函数只包含一个自身的调用&#xff0c;这称之为 single recursion 如果每个递归函数例包含多个自身调用&#xff0c;称之为 multi recursion 递推关系 下面的表格列出了数列的前几项 F0F1F2F3F4F5F6F7F8F9F10F11F12…

空气传导耳机哪个牌子好?市面上热销火爆的气传导耳机推荐

​传统入耳式耳机佩戴着容易滑落&#xff0c;戴不稳&#xff0c;久戴耳朵酸痛等问题&#xff0c;气传导耳机的出现就避免了这些问题的发生&#xff0c;我来推荐几款市面上热销火爆且使用感不错的气传导耳机给到大家&#xff0c;来看看吧&#xff01; 推荐1&#xff1a;NANK南卡…

[ubuntu]给WSL子系统ubuntu安一个桌面环境

sudo apt install xorg sudo apt install xfce4 sudo apt install xrdp sudo sed -i s/port3389/port3390/g /etc/xrdp/xrdp.ini sudo echo xfce4-session >~/.xsession sudo service xrdp restart 查看自己ip地址&#xff1a; ifconfig 然后在windows上任务栏搜远程桌面 …

亚马逊鲲鹏系统全自动化功能有哪些

亚马逊鲲鹏系统可以批量注册亚马逊买家号、AI智能养号、自动绑定收货地址及支付卡、开通二步验证、自动添加购物车、自动购买、自动留评、评论点赞或举报、QA等。 下面就详细介绍一下一些比较常用的自动化功能&#xff1a; 1、全自动注册 想要注册买家号&#xff0c;那么需要…

自动化测试基础知识详解

前言 有颜色的标注主要是方便记忆&#xff0c;勾选出个人感觉的重点 块引用&#xff1a;大部分是便于理解的话&#xff0c;稍微看看就行&#xff0c;主要是和正常的文字进行区分的 1、什么是自动化测试 自动化测试是软件测试活动中一个重要分支和组成部分&#xff0c;随着软…

Leetcode128. 最长连续序列

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 题解&#…

java 版本企业招标投标管理系统源码+功能描述+tbms+及时准确+全程电子化

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…

WINGREEN 034STN1-01-300-R 传感器模块

WINGREEN 034STN1-01-300-R 是一种传感器模块&#xff0c;通常用于监测和采集各种环境或过程参数的数据。以下是这种类型的传感器模块通常可能具备的一般功能和特点&#xff1a; 传感器接口&#xff1a;模块通常配备用于连接不同类型传感器的接口&#xff0c;如温度传感器、湿度…

贝塞尔曲线的一些资料收集

一本免费的在线书籍&#xff0c;供你在非常需要了解如何处理贝塞尔相关的事情。 https://pomax.github.io/bezierinfo/zh-CN/index.html An algorithm to find bounding box of closed bezier curves? - Stack Overflow https://stackoverflow.com/questions/2587751/an-algo…

Linux 中的 cfdisk 命令及示例

cfdisk命令用于在磁盘设备上创建、删除和修改分区。它通过提供基于文本的“图形”界面来显示或操作磁盘分区表。 cfdisk /dev/sda 示例: 运行后您会收到如下提示:从列表中

YOLO目标检测——昏暗车辆数据集+已标注VOC格式标签下载分享

实际项目应用&#xff1a;昏暗车辆数据集在智能交通监控系统、驾驶辅助系统、城市安全监控、自动驾驶系统以及路况分析与规划等应用场景中具有广泛的应用潜力&#xff0c;可以提高车辆检测的准确性和效率&#xff0c;提升交通安全和城市管理水平。数据集说明&#xff1a;昏暗车…

leetcode 2. 两数相加(java)

两数相加 题目描述哨兵技巧代码演示&#xff1a; 递归算法专题 题目描述 难度 - 中等 leetcode 2. 两数相加 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&…

【LeetCode-中等题】90. 子集 II

文章目录 题目方法一&#xff1a;递归加回溯&#xff08;去重版&#xff09;![在这里插入图片描述](https://img-blog.csdnimg.cn/abc4e8d0e3f940fcbdcb072acf80734e.png) 题目 本题nums数组存在重复元素&#xff0c;所以本题会涉及一个去重操作&#xff1a; 子集无需去重版本&…

redis 高可用

Redis 高可用 在web服务器中&#xff0c;高可用是指服务器可以正常访问的时间&#xff0c;衡量的标准是在多长时间内可以提供正常服务&#xff08;99.9%、99.99%、99.999%等等&#xff09;。 但是在Redis语境中&#xff0c;高可用的含义似乎要宽泛一些&#xff0c;除了保证提供…