element-plus树形数据与懒加载的实现

环境

vue版本: 2.6.14

需求

树形表格,默认返回当前登录人拥有权限的一个层级的数据,通过点击load懒加载获取下一层的数据,要求有新增、编辑、删除操作。

树类型的懒加载:

当row中包含children字段时,被视为树形数据。渲染嵌套数据需要prop的row-key。且子节点数据可以异步加载。通过row中的hasChildren字段来指定哪些行是包含子节点。children与hasChildren都可以通过tree-props进行配置。需要设置el-table的lazy属性为true且需要load加载函数,数据懒加载且不可使用 default-expand-all 属性。

代码实现如下:

   <el-tableref="tableRef":loading="loading":data="tableData"row-key="id"borderlazy:load="load":tree-props="{ children: 'children', hasChildren: 'hasChildren' }"><el-table-column prop="date" label="Date" /><el-table-column prop="name" label="Name" /><el-table-column prop="address" label="Address" /><el-talbe-column label="操作"><template v-slot="{ row }"><el-button type="primary" @click="() => add(row.id)">添加</el-button><el-button type="default" @click="() => edit(row.id)">编辑</el-button><el-button type="danger" @click="() => delete(row.parentId)">删除</el-button></template></el-talbe-column></el-table>
export default {data() {return {tableData: [],loading: false,loadMap: new Map()}},async mounted() {this.queryTableList();},methods:{async queryTableList() {this.loading = true;// 接口调用获取树形数据try {const { data, code } = await api.getList({id: undefined});if(code === 200) {// 将返回的数据结构处理为树形结构this.tableData = this.processTreeData(data);return this.tableData;} else {return []}} finally {this.loading = false;}},processTreeData(data) {return data.map(item => {// 添加hasChildren属性,表示是否有子节点const hasChildren = item.children && item.children.length > 0;// 递归处理子节点const children = hasChildren ? this.processTreeData(item.children) : [];// 假如每个节点的类型都是不同的,最后一个子节点的type为lastreturn {...item,hasChildren: item.type === 'last' ? hasChildren : !hasChildren,children}})},async load(tree, treeNode, resolve) {this.loading = true;this.loadMap.set(tree.id, { tree, treeNode, resolve});try {const { data, code } = await api.getList({id: tree.id});if(code === 200) {if(data && data.length) {resolve(this.processTreeData(data))} else {this.$set(this.$refs.tableRef.store.states.lazyTreeNodeMap, tree.id, [])resolve([])}} else {resolve([])}} finally {this.loading = false;}},// 刷新列表refresh(id) {if(this.loadMap.get(id)) {const { tree, treeMap, resolve } = this.loadMap.get(id);if(tree) {this.load(tree, treeMap, resolve)}}},// 添加节点add(id) {// 添加成功后,直接调用this.refresh(id);},// 编辑节点edit(id) {// 根据当前id获取该条数据信息,返回数据中要求有父级的idconst parentId = 111; // 父级返回的idthis.refresh(parentId);},// 删除delete(id) {// 需要传递父级的idthis.refresh(id);}}
}

一、要求最后一个子节点不显示要展开的箭头

item.type === 'last' ? hasChildren : !hasChildren

二、当返回的数据为空数组,会导致列表一直显示加载状态。

this.$set(this.$refs.tableRef.store.states.lazyTreeNodeMap, tree.id, [])

清空 lazyTreeNodeMap 中的对应数据:在数据为空数组时,手动清空 lazyTreeNodeMap 中对应的数据,这样可以避免加载状态的持续显示。

这个问题的主要原因在于懒加载的机制:懒加载的load函数只在第一次打开子节点时触发,之后不会再次触发,因此数据无法实时刷新。


扩展:将一个子节点迁移至另一个父节点下面

避免遇到的问题:

[Vue warn]: Duplicate keys detected: '111'. This may cause an update error.

引起该问题的原因是列表中数据id值重复。

*在迁移数据时,一定要先调用被迁移子节点的父节点,再调用新的父节点获取数据,避免数据冲突。

欢迎在评论区讨论,完善功能代码。

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

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

相关文章

docker 改了镜像源为阿里云,还是下载失败

我是windows系统&#xff0c;在学习docker&#xff0c;刚开始执行docker run hello-world还是失败&#xff0c;然后改了镜像源为阿里云&#xff0c;还是失败&#xff0c;后来去查资料&#xff0c;除了阿里云还配置了很多其他镜像源&#xff0c;才好使 "registry-mirrors&q…

mysql总结

系列文章目录 暂无 前言 mysql面试题的总结以及部分原理&#xff0c;部分图片为网上资源&#xff0c;如侵权请告知删除。 一、MySQL 执行流程 1.连接器&#xff1a;建立连接&#xff0c;管理连接、校验用户身份&#xff1b; 2.查询缓存&#xff1a;查询语句如果命中查询缓存…

【Linux网络编程】应用层协议HTTP(请求方法,状态码,重定向,cookie,session)

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux网络编程 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ Linux网络编程笔记&#xff1a; https://blog.cs…

城市地质安全专题连载⑦ | 加强国土空间规划管控,规避城市地质安全风险

作者 | 徐海洋 在国土空间规划中&#xff0c;地质调查扮演着先导性和基础性的角色。它如同一把无形的尺子&#xff0c;衡量着每一寸土地的开发潜力与安全边界&#xff0c;不仅为城市规划提供了科学依据&#xff0c;还在规避地质安全风险、优化资源配置方面发挥着关键作用。然而…

内部知识库:安全协作驱动数字化转型新路径

内容概要 在数字化转型进程中&#xff0c;内部知识库作为信息聚合与分发的核心载体&#xff0c;正通过安全协作与智能权限管理重构企业知识治理模式。其核心价值在于将分散的部门数据、经验文档与业务洞察整合至统一平台&#xff0c;形成可追溯、可共享的企业级知识中台&#…

【分布式理论11】分布式协同之分布式事务(一个应用操作多个资源):从刚性事务到柔性事务的演进

文章目录 一. 什么是分布式事务&#xff1f;二. 分布式事务的挑战三. 事务的ACID特性四. CAP理论与BASE理论1. CAP理论1.1. 三大特性1.2. 三者不能兼得 2. BASE理论 五. 分布式事务解决方案1. 两阶段提交&#xff08;2PC&#xff09;2. TCC&#xff08;Try-Confirm-Cancel&…

ARM Linux平台下 OpenCV Camera 实验

一、硬件原理 1. OV2640 1.1 基本功能 OV2640 是一款低功耗、高性能的图像传感器&#xff0c;支持以下功能&#xff1a; 最高分辨率&#xff1a;200 万像素&#xff08;1600x1200&#xff09;。 输出格式&#xff1a;JPEG、YUV、RGB。 内置图像处理功能&#xff1a;自动曝…

Modbus协议基础

文章目录 1、Modbus协议基础知识1.1、Modbus存储范围1.2、Modbus协议功能码说明1.3、Modbus协议分类及测试 2、ModbusRTU通信报文分析2.1、modbusRTU通信格式 3、Modbus通信库开发4、通信库测试 1、Modbus协议基础知识 1.1、Modbus存储范围 modbus规定&#xff0c;每个存储区…

电脑想安装 Windows 11 需要开启 TPM 2.0 怎么办?

尽管 TPM 2.0 已经内置在许多新电脑中&#xff0c;但很多人并不知道如何激活这一功能&#xff0c;甚至完全忽略了它的存在。其实&#xff0c;只需简单的几步操作&#xff0c;你就能开启这项强大的安全特性&#xff0c;为你的数字生活增添一层坚固的防护屏障。无论你是普通用户还…

node 使用 Redis 缓存

缓存是什么&#xff1f; 高并发下&#xff0c;一个项目最先出问题的&#xff0c;并不是程序本身&#xff0c;而是数据库最先承受不住。 在数据库上我们可以做很多优化&#xff0c;例如优化 SQL 语句&#xff0c;优化索引&#xff0c;如果数据量大了&#xff0c;还可以分库、分表…

解决双系统开机显示gnu grub version 2.06 Minimal BASH Like Line Editing is Supported

找了好多教程都没有用&#xff0c;终于解决了&#xff01;&#xff01;我是因为ubuntu分区的时候出问题了 问题描述&#xff1a; 双系统装好&#xff0c;隔天开机找不到引导项&#xff0c;黑屏显示下列 因为我用的D盘划分出来的部分空闲空间&#xff0c;而不是全部&#xff0c…

NLP-RNN-LSTM浅析

目录 双向 LSTM&#xff08;Bi - LSTM&#xff09; 双向 LSTM&#xff08;Bi - LSTM&#xff09;原理深入讲解 代码示例&#xff08;基于 PyTorch&#xff09; LSTM 应用到双向 RNN 中 代码示例&#xff08;基于 PyTorch&#xff09; 双向 LSTM - CRF&#xff08;Conditio…

自动化之ansible(二)

一、ansible中playbook&#xff08;剧本&#xff09; 官方文档&#xff1a; Ansible playbooks — Ansible Community Documentation 1、playbook的基本结构 一个基本的playbook由以下几个主要部分组成 hosts: 定义要执行任务的主机组或主机。 become: 是否需要使用超级用户…

uni-app小程序开发 基础知识2

目标&#xff1a; 构建一个文章发表平台。 我们先来写一个静态框架。 以下是 首页初代码文章列表页代码&#xff1a; <template><view class"content"><!-- 轮播图 --><swiper class"swiper-container" autoplay"true"…

kafka-集群扩容

一. 前言&#xff1a; 随着业务增加&#xff0c;我们会面临这kafka当性能问题&#xff0c;需要进行集群扩容&#xff0c;增加broker节点。 二. 扩容说明: 增加新服务到kafka集群是很容易的(参考&#xff1a; kafka-部署安装-CSDN博客 )&#xff0c;只要为新服务分配一个独一无…

uni-app开发app时 使用uni.chooseLocation遇到的问题

问题一&#xff1a;不显示 问题二&#xff1a;选择地址列表一直在加载中 因为 uni-app 接口文档 中已经说明&#xff0c;使用腾讯的话需要开启云服务&#xff0c;具体可看官网&#xff0c;这就是为什么使用时直接不显示的原因&#xff0c;所以我使用的高德&#xff0c;但又出现…

RabbitMQ的脑裂(网络分区)问题

问题描述&#xff1a; Mnesia reports that this RabbitMQ cluster has experienced a network partition. There is a risk of losing data 一、什么是MQ脑裂&#xff1f; 网络分区 如果另一个节点在一段时间内&#xff08;默认为 60 秒&#xff09;无法与其联系&#xff0…

SQL知识体系

SQL复习 MySQL SQL介绍 SQL SQL的全拼是什么&#xff1f; SQL全拼&#xff1a;Structured Query Language&#xff0c;也叫结构化查询语言。 SQL92和SQL99有什么区别呢&#xff1f; SQL92和SQL99分别代表了92年和99年颁布的SQL标准。 在 SQL92 中采用&#xff08;&#xff…

企业商业秘密百问百答之五十三【商业秘密转让】

《企业商业秘密百问百答》是由天禾律所陈军律师团队精心编撰的成果&#xff0c;汇集了该团队律师在处理商业秘密相关的刑事和民事案件中的丰富经验。近年来&#xff0c;这份资料已通过线上和线下的方式向全国近千家企业进行了广泛宣讲&#xff0c;并获得了积极的社会反响。 其…

巧用GitHub的CICD功能免费打包部署前端项目

近年来&#xff0c;随着前端技术的发展&#xff0c;前端项目的构建和打包过程变得越来越复杂&#xff0c;占用的资源也越来越多。我有一台云服务器&#xff0c;原本打算使用Docker进行部署&#xff0c;以简化操作流程。然而&#xff0c;只要执行sudo docker-compose -f deploy/…