当前位置: 首页 > news >正文

在Vue3+ElementPlus项目中使用具有懒加载的el-tree树形控件

前言

有时遇到一些需求就是在使用树形控件时,服务端并没有一次性返回所有数据,而是返回首层节点列表。然后点击展开首层节点中的某个节点,再去请求该节点的子节点列表,那么就得用上懒加载的机制了。在此以ElementPlus的树形控件为例,实现一个具有懒加载的树形控件的示例页面。

传送门:https://element-plus.gitee.io/zh-CN/component/tree.html

一、示例代码

(1)/src/views/Example/ElTreeLazy/index.vue

<template><el-scrollbar v-loading="treeLoading" element-loading-text="数据正在渲染中..." class="element-plus-tree"><el-treelazyref="treeRef":props="defaultProps":data="treeData":load="loadNode":show-checkbox="false":default-expand-all="false":highlight-current="true":expand-on-click-node="false"@node-click="handleNodeClick"><template #default="{ node, data }"><span v-if="!data.leaf" class="node-folder"><el-icon v-if="node.expanded" style="margin: 0 6px 0 0px;" size="16"><FolderOpened /></el-icon><el-icon v-else style="margin: 0 6px 0 0px;" size="16"><Folder /></el-icon><small :title="node.label">{{ node.label }}</small></span><span v-else class="node-file"><el-icon style="margin: 0 6px 0 0px;" size="16"><Document /></el-icon><small :title="node.label">{{ node.label }}</small></span></template></el-tree></el-scrollbar>
</template><script setup>
import { onMounted, onUnmounted, ref, getCurrentInstance, defineExpose } from 'vue'// 代理对象
const { proxy } = getCurrentInstance()// 树组件实例
const treeRef = ref(null)// 树组件数据
const treeData = ref([])// 加载中
const treeLoading = ref(true)// 树节点属性映射关系
const defaultProps = {children: 'children',label: 'name',isLeaf: 'leaf',
}/*** 加载节点*/
const loadNode = async (node, resolve) => {// 首层节点,即:根节点if (node.level === 0) {resolve(node.data)}// 第二层节点if (node.level === 1) {// 判断某个节点的子节点列表是否非空,非空则不调用接口,否则调用接口查询该节点的列表if (node.data.children) {resolve(node.data.children)} else {setTimeout(() => {const res = { success: true, data: [] }if (res.success) {const nodeNum = parseInt(Math.random() * 10) + 1 // 1 ~ 10for (let i = 1; i <= nodeNum; i++) {res.data.push({name: `哈哈哈-${i}`,})}const hasChild = Math.random() > 0.5if (hasChild) {const childNum = parseInt(Math.random() * 5) + 1 // 1 ~ 5for (let vo of res.data) {vo.children = []for (let i = 1; i <= childNum; i++) {vo.children.push({name: `嘻嘻嘻-${i}`,})}}}console.log('叶子节点加工前 =>', res)handleJudgeLeafrecursion(res.data)console.log('叶子节点加工后 =>', res)} else {proxy.$message({ message: '请求失败', type: 'error', duration: 3000 })}node.data.children = res.dataresolve(node.data.children)}, 200)}}// 第三层节点,以及其它层节点if (node.level > 1) {if (node.data.children && node.data.children.length > 0) {resolve(node.data.children)} else {resolve([])}}
}/*** 获取首层节点数据列表*/
const getFirstLevelNodeData = () => {const res = {success: true,data: ['香烟Wifi啤酒', '火腿iPad泡面', '骑着蜗牛散步', '都随它大小便吧', '没有强度,全是手法']}const list = []setTimeout(() => {if (res.success) {for (let i = 0; i < res.data.length; i++) {list.push({'id': i + 1,'name': res.data[i],})}} else {proxy.$message({ message: '请求失败', type: 'error', duration: 3000 })}treeData.value = listtreeLoading.value = false}, 200)
}/*** 判断叶子节点递归方法*/
const handleJudgeLeafrecursion = (list) => {for (let vo of list) {// 若无 children 或 children 大小为零,即判定该节点为叶子节点if (vo.children == null || vo.children.length == 0) {vo.leaf = true} else {handleJudgeLeafrecursion(vo.children)}}
}/*** 树节点点击事件句柄方法*/
const handleNodeClick = (data) => {console.log('handleNodeClick =>', data)
}// 子组件通过 defineExpose 暴露指定的属性给父组件
defineExpose({treeRef, // 暴露树组件实例
})onMounted(() => {getFirstLevelNodeData()
})onUnmounted(() => {// ...
})
</script><style lang="less" scoped>.element-plus-tree {height: 100%;:deep(.el-tree) {padding-left: 5px;/* ---- ---- ---- ---- ^(节点对齐)---- ---- ---- ---- */.el-tree-node {/* ^ 所有节点 */i.el-tree-node__expand-icon {padding: 6px;margin-right: 5px;&::before {font-family: element-ui-icons;font-style: normal;content: "\e6d9";color: #000000;border: 1px solid #606266;border-radius: 2px;}svg {display: none; // 隐藏所有节点的 svg 图标}}/* / 所有节点 *//* ^ 已展开的父节点 */i.el-tree-node__expand-icon.expanded {transform: rotate(0deg); // 取消旋转-webkit-transform: rotate(0deg); // 取消旋转&::before {font-family: element-ui-icons;font-style: normal;content: "\e6d8";color: #000000;border: 1px solid #606266;border-radius: 2px;}}/* / 已展开的父节点 *//* ^ 叶子节点 */i.el-tree-node__expand-icon.is-leaf {&::before {display: none;}}/* / 叶子节点 *//* ^ 复选框 */.el-checkbox {margin: 0 7px 0 2px;.el-checkbox__inner {width: 14px;height: 14px;border-radius: 2px;border: 1px solid #bbb;}.el-checkbox__input.is-checked .el-checkbox__inner,.el-checkbox__input.is-indeterminate .el-checkbox__inner {border: 1px solid #5e7ce0;}}/* / 复选框 */.el-tree-node__content {small {font-size: 13px;padding-right: 5px;transition: all ease 0.1s;}}}/* ---- ---- ---- ---- /(节点对齐)---- ---- ---- ---- *//* ---- ---- ---- ---- ^(文字/背景高亮)---- ---- ---- ---- */.el-tree-node {.el-tree-node__content {background-color: transparent;.node-root {display: flex;align-items: center;small {font-weight: bold;color: #40485c;transition: all ease 0.3s;}}.node-folders {display: flex;align-items: center;small {font-weight: bold;color: #40485c;transition: all ease 0.3s;}}.node-folder {display: flex;align-items: center;small {font-weight: bold;color: #40485c;transition: all ease 0.3s;}}.node-file {display: flex;align-items: center;small {font-weight: normal;color: #40485c;transition: all ease 0.3s;}}&:hover small {color: #5e7ce0;}}}.el-tree-node.is-current {.el-tree-node__content {small {color: #5e7ce0;}}.el-tree-node__children {small {color: unset;}}}&.el-tree--highlight-current .el-tree-node.is-current > .el-tree-node__content {background-color: #eff2fc;// background-color: #b6c7ff;i::before, i::after {// border-color: #fff;// color: #fff;border-color: #002293;color: #002293;}small {// color: #fff;color: #002293;}}/* ---- ---- ---- ---- /(文字/背景高亮)---- ---- ---- ---- *//* ---- ---- ---- ---- ^(新增辅助线)---- ---- ---- ---- *//* ^ 树节点 */.el-tree-node {position: relative;width: auto;width: max-content; // 显示文字宽度padding-left: 13px;&::before {width: 1px;height: 100%;content: '';position: absolute;top: -38px;bottom: 0;left: 0;right: auto;border-width: 1px;border-left: 1px solid #b8b9bb;}&::after {width: 13px;height: 13px;content: '';position: absolute;z-index: 0;left: 0;right: auto;top: 12px;bottom: auto;border-width: 1px;border-top: 1px solid #b8b9bb;}.el-tree-node__content {position: relative;z-index: 1;padding-left: 0 !important;/* ^ 复选框 */.el-checkbox {margin: 0 10px 0 0.5px;}/* / 复选框 */}.el-tree-node__children {padding-left: 12px;}&:last-child::before {height: 50px;}}/* / 树节点 *//* ^ 第一层节点 */> .el-tree-node {padding-left: 0;&::before {border-left: none;}&::after {border-top: none;}.el-tree-node__content {i.el-tree-node__expand-icon.is-leaf {margin-right: 5px;}}}/* / 第一层节点 *//* ---- ---- ---- ---- /(新增辅助线)---- ---- ---- ---- */}}
</style>

二、运行效果

// Todo

相关文章:

在Vue3+ElementPlus项目中使用具有懒加载的el-tree树形控件

前言 有时遇到一些需求就是在使用树形控件时&#xff0c;服务端并没有一次性返回所有数据&#xff0c;而是返回首层节点列表。然后点击展开首层节点中的某个节点&#xff0c;再去请求该节点的子节点列表&#xff0c;那么就得用上懒加载的机制了。在此以ElementPlus的树形控件为…...

高浓度工业废水处理设备有哪些

高浓度工业废水处理设备主要有以下几种&#xff1a; 水解酸化池&#xff1a;将有机废水通过水解、酸化作用&#xff0c;使其成为更易于生化降解的有机物。厌氧池&#xff1a;通过厌氧反应降解有机废水&#xff0c;产生沼气等可再利用资源。好氧池&#xff1a;将经过水解酸化或…...

linux上传mysql数据库

如果你使用的是Linux操作系统&#xff0c;并且需要上传MySQL数据库&#xff0c;那么可以按照以下步骤进行操作&#xff1a; 1. 在终端登录到你的Linux服务器&#xff1b; 2. 运行以下命令&#xff0c;以安装MySQL客户端&#xff1a;sudo apt-get install mysql-client&#xf…...

easyexcel根据模板导出Excel文件,表格自动填充问题

背景 同事在做easyexcel导出Excel&#xff0c;根据模板导出的时候&#xff0c;发现导出的表格&#xff0c;总会覆盖落款的内容。 这就很尴尬了&#xff0c;表格居然不能自动填充&#xff0c;直接怒喷工具&#xff0c;哈哈。 然后一起看了一下这个问题。 分析原因 我找了自…...

golang调用智能合约,获取合约函数的返回值

如果不是只读取数据的合约函数&#xff0c;需要异步的执行&#xff0c;因此并不能直接获取到合约函数的返回值&#xff0c;需要等到交易执行完毕&#xff0c;得到确认后才能获取到合约函数的返回值。而且合约函数返回值一般是通过事件日志获取到的。 这里给出一个例子来展示我…...

Django3框架-(3)-[使用websocket]:使用channels实现websocket功能;简化的配置和实际使用方式

概述&#xff1a; 对于Django使用channels实现websocket的功能&#xff0c;之前就写了几篇博文了。随着在项目的使用和实际维护来说&#xff0c;重新设置了相关处理方法。 一般来说&#xff0c;前后端都只维护一个全局的连接&#xff0c;通过携带数据来判断具体的操作&#x…...

java-工具类抛异常

不满足条件就会报错&#xff0c;这里的accessors ! null&#xff0c;就是等于空的时候&#xff08;不满足&#xff09;就会报错 accessors null; Assert.isTrue(ObjectUtil.isNotEmpty(accessors ! null), "数据为空");...

Navicat连接postgresql数据库 -->华为云服务器

Navicat连接postgresql数据库 -->华为云服务器 2.开放服务器端口&#xff1a;54323.Navicat连接postgresql数据库 2.开放服务器端口&#xff1a;5432 1-1.选择安全组 1-2. 添加规则 1-3.开放5432端口规则 1-4.查看规则 3.Navicat连接postgresql数据库...

Leetcode2086. 从房屋收集雨水需要的最少水桶数

Every day a Leetcode 题目来源&#xff1a;2086. 从房屋收集雨水需要的最少水桶数 解法1&#xff1a;贪心 我们可以对字符串 hamsters 从左到右进行一次遍历。 每当我们遍历到一个房屋时&#xff0c;我们可以有如下的选择&#xff1a; 如果房屋的两侧已经有水桶&#xff…...

Pandas教程(非常详细)(第一部分)

Pandas 库是一个免费、开源的第三方 Python 库&#xff0c;是 Python 数据分析必不可少的工具之一&#xff0c;它为 Python 数据分析提供了高性能&#xff0c;且易于使用的数据结构&#xff0c;即 Series 和 DataFrame。Pandas 自诞生后被应用于众多的领域&#xff0c;比如金融…...

typing.Union` 标注一多种变量类型

typing.Union 标注一多种变量类型 typing.Union 是Python typing 模块中用于标注一个变量可以是多种类型之一的类型提示。在Python 3.10版本及以后&#xff0c;推荐使用 | 运算符代替 Union。不过&#xff0c;在详细介绍 Union 的用法前&#xff0c;值得注意的是在大多数情况下…...

OSPF高级特性

OSPF高级特性(1) 一、OSPF不规则区域类型 产生原因&#xff1a;区域划分不合理&#xff0c;导致的问题 1、非骨干区域无法和骨干区域保持连通 2、骨干区域被分割 造成后果&#xff1a;非骨干区域没和骨干区域相连&#xff0c;导致ABR将不会帮忙转发区域间的路由信息。非骨干区…...

mysql中日期的加减 date_add()、date_sub() 函数

一、说明 DATE_ADD() &#xff1a;从日期增加指定的时间间隔&#xff0c;返回的是一个字符串 DATE_ADD(date,INTERVAL expr type) date 参数是合法的日期表达式。expr 参数是您希望添加的时间间隔。 type 参数可以是下列值 二、使用 now() //now函数为获取当前时间 sele…...

实在智能携手品牌商家,在活动会面中共谋发展

金秋十月&#xff0c;丰收的季节&#xff0c;也是商家们在双11大展拳脚的时刻。为迎战一年一度的双11大促&#xff0c;品牌商家在10月份卯足劲&#xff0c;制定一系列营销方案&#xff0c;争取为店铺带来更多流量和订单。 其中&#xff0c;舍得、同科医药、梅子熟了、宝洁、维…...

EXSi系统安装与使用

文章目录 EXSi系统安装与使用EXSi系统安装1.打开VMware Workstation软件2.安装系统3.配置虚拟机 使用EXSi登录web页面扩充存储创建虚拟机使用虚拟机 EXSi系统安装与使用 EXSi系统安装 1.打开VMware Workstation软件 创建虚拟机 2.安装系统 等待 回车 F11 回车 回车 设置密码…...

Spring MVC (Next-1)

1.Restful请求 restFul是符合rest架构风格的网络API接口,完全承认Http是用于标识资源。restFul URL是面向资源的&#xff0c;可以唯一标识和定位资源。 对于该URL标识的资源做何种操作是由Http方法决定的。 rest请求方法有4种&#xff0c;包括get,post,put,delete.分别对应获取…...

双目视觉检测 KX02-SY1000型测宽仪 有效修正和消除距离变化对测量的影响

双目视觉检测的基本原理 利用相机测量宽度时&#xff0c;由于单个相机在成像时存在“近大远小”的现象&#xff0c;并且单靠摄入的图像无法知道被测物的距离&#xff0c;所以由被测物的跳动导致的被测物到工业相机之间距离变化&#xff0c;使测量精度难以提高。 因此测宽仪需…...

C++ 面向对象 学习 优秀教程

油管看视频 沉浸式翻译插件&#xff0c;实现中文字幕&#xff01; 文章目录 Object Oriented Programming (OOP) in C Course Object Oriented Programming (OOP) in C Course https://www.youtube.com/watch?vwN0x9eZLix4 博主&#xff1a;https://www.youtube.com/CodeBeau…...

Python笔记——pyChram连接linux子系统,使用linux下的Python进行编译

Python笔记——pyChram连接linux子系统&#xff0c;使用linux下的Python进行编译 Linux子系统安装与配置安装前准备安装Linux子系统安装Python3.8配置pyCharm 最近要跑的实验里&#xff0c;python有个机器学习的库windows环境下是没有的&#xff0c;在linux环境下有。虚拟机又不…...

【数据结构】数组和字符串(七):特殊矩阵的压缩存储:三元组表的转置、加法、乘法操作

文章目录 4.2.1 矩阵的数组表示4.2.2 特殊矩阵的压缩存储a. 对角矩阵的压缩存储b~c. 三角、对称矩阵的压缩存储d. 稀疏矩阵的压缩存储——三元组表4.2.3三元组表的转置、加法、乘法、操作转置加法乘法算法测试实验结果代码整合 4.2.1 矩阵的数组表示 【数据结构】数组和字符串…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

19c补丁后oracle属主变化,导致不能识别磁盘组

补丁后服务器重启&#xff0c;数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后&#xff0c;存在与用户组权限相关的问题。具体表现为&#xff0c;Oracle 实例的运行用户&#xff08;oracle&#xff09;和集…...

Ubuntu系统下交叉编译openssl

一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机&#xff1a;Ubuntu 20.04.6 LTSHost&#xff1a;ARM32位交叉编译器&#xff1a;arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...