Vue(十九):ElementUI 扩展实现树形结构表格组件的勾父选子、半勾选、过滤出半勾选节点功能

news2024/10/5 18:23:48

效果

在这里插入图片描述

原理分析

  1. 从后端获取数据后,判断当前节点是否勾选,从而判断是否勾选子节点
  2. 勾选当前节点时,子节点均勾选
  3. 全勾选半勾选不勾选的样式处理
  4. 全勾选全取消勾选的逻辑
  5. 筛选出半勾选的节点

定义变量

import {
   computed, nextTick, reactive, ref} from 'vue';
import {
   tree} from "./tree.js";

// 默认节点
const tableData = reactive([
    {
   id: '节点1', hasChildren: true}, {
   id: '节点2', hasChildren: true},
    {
   id: '节点3', hasChildren: true}, {
   id: '节点4', hasChildren: true},
]);
const treeTableRef = ref();         // 表格实例
const selections = ref([]);			// 勾选节点
const childrenNodes = reactive({
   });	// 全部子节点
const isSelectedAll = ref(false);   // 是否勾选全部

定义是否勾选全部子节点函数

/**
 * 勾选子节点
 * @param id
 * @param selected
 */
const selectedChildren = (id, selected) => {
   
	(childrenNodes[id] || []).forEach(row => {
   
		treeTableRef.value.toggleRowSelection(row, selected);
		if (id !== row.id) selectedChildren(row.id, selected);
	});
}

单个节点勾选函数

/**
 * 单个节点勾选
 * @param selection    选中节点集合
 * @param row        当前节点
 */
const select = (selection, row) => {
   
	nextTick(() => {
   
		// 是否勾选当前节点下全部子节点
		selectedChildren(row.id, selection.some(d => d.id === row.id));
	});
}

从后端获取节点数据

/**
 * 加载子节点
 * @param row        当前节点
 * @param treeNode    节点状态
 * @param resolve    渲染子集函数
 */
const load = (row, treeNode, resolve) => {
   
	setTimeout(() => {
   
		childrenNodes[row.id] = (tree[row.id] || []).map(d => ({
   ...d, parentId: row.id}));
		resolve(childrenNodes[row.id]);
		// 判断当前节点是否选中,选中则自动勾选子节点
		nextTick(() => select(selections.value, row));
	}, 100);
}

全勾选、全取消勾选函数和勾选监听

/**
 * 全选节点勾选
 * @param selection    选中节点集合
 */
const selectAll = (selection) => {
   
	isSelectedAll.value = !isSelectedAll.value;
	treeTableRef.value.data.forEach(row => {
   
		// 默认数据的勾选
		treeTableRef.value.toggleRowSelection(row, isSelectedAll.value);
		// 是否勾选全部节点下全部子节点
		selectedChildren(row.id, isSelectedAll.value);
	});
}

/**
 * 监听节点选择事件
 * @param selection    选中节点集合
 */
const selectionChange = (selection) => {
   
    selections.value = selection;
    // 勾选的节点数量为0时,设置勾选全部的状态为false
    nextTick(() => ((selection.length === 0) && (isSelectedAll.value = false)));
}

表头Checkbox选中样式

/**
 * 表格头选中状态
 * @type {ComputedRef<string>}    样式选择器名称
 */
const headerRowClassName = computed(() => {
   
	let count = tableData.length;
	for (const key in childrenNodes) {
   
		count += (childrenNodes[key] || []).length;
	}
	return (count === selections.value.length || selections.value.length === 0) ? '' : 'half-checked';
})

定义当前节点样式选择器

/**
 * 定义表格行样式选择器
 * @param row            当前节点
 * @param rowIndex        当前节点索引
 * @returns {string}    样式选择器名称
 */
const rowClassName = ({
    row, rowIndex}) => {
   
	if (selections.value.length === 0) return '';

	const selectedNodeFlags = []; // 存储节点的状态

	/**
	 * 筛选子节点勾选状态
	 * @param item    当前节点
	 */
	const filterSelectedChildrenNodeFlags = (item) => {
   
		(childrenNodes[item.id] || []).forEach(node => {
   
			// 避免死循环
			if (item.id 

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

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

相关文章

我该坚持纯正原创?还是随波逐流做搬运作者?

本文可能不是一个热点文章&#xff0c;甚至可能不是一个网创者该关心的文章&#xff0c;但是阿阳真心希望&#xff0c;大家可以静下心来看看。 阿阳在网赚领域混了差不多十年&#xff0c;这么多年也经历不少。我不想吹嘘什么&#xff0c;可能是因为年纪大了&#xff0c;觉得低调…

毕业设计----Ajax请求遇到的问题Uncaught TypeError: Cannot read properties of undefi

目录 问题 问题 总的来说&#xff0c;就是我在form表单新增了一个字段&#xff0c;在表单的验证规则中添加了一个名为 code 的自定义验证规则&#xff0c;但是没有提供该规则的实现代码&#xff0c;validate.js提示报错。 所以为了使验证规则生效&#xff0c;添加自定义验证方…

BODIPY FL NHS,BODIPY FL NHS 活化酯,可以实现对特定生物分子的可视化追踪和定位

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;BODIPY FL NHS ester&#xff0c;BODIPY FL NHS&#xff0c;BODIPY FL NHS 活化酯 一、基本信息 产品简介&#xff1a;BODIPY FL NHS ester, by combining BODIPY with NHS ester, this reagent is able to react w…

【CSS】常见

一. 溢出隐藏 1.1 单行文本溢出 .content{max-width:200px; /* 定义容器最大宽度 */overflow:hidden; /* 隐藏溢出的内容 */text-overflow:ellipsis; /* 溢出部分...表示 */white-space: nowrap; /* 确保文本在一行内显示 */ }问题&#xff1a;display:flex 和 ellipsis 冲…

Java学习之基础语法

Java学习之基础语法 本文主要是对于有了其他语言基础的人总结的资料&#xff0c;因此本文只写出了Java与C语言&#xff0c;C等语言的区别之处与部分重点。 1.基础语法&#xff1a; 1.1.包与类&#xff1a; 1.1.1.包&#xff1a; 在Java中&#xff0c;包&#xff08;packag…

Asp.net移除Server, X-Powered-By, 和X-AspNet-Version头

移除X-AspNet-Version很简单,只需要在Web.config中增加这个配置节: <httpRuntime enableVersionHeader"false" />移除Server在Global.asax文件总增加&#xff1a; //隐藏IIS版本 protected void Application_PreSendRequestHeaders() {HttpContext.Current.Res…

【题解 拓扑思维】 C - Building Company

题目描述: 分析&#xff1a; 对于每一个项目&#xff0c;需要满足几个条件&#xff0c;对于每一个条件&#xff0c;表示为第i项工作需要有几个人做。 这几个条件全部满足后&#xff0c;这个项目就可以收入囊下&#xff0c;同时获得新的员工 对于每一个项目的几个条件&#xf…

vxe-table3.0的表格树如何做深层查找,返回搜索关键字的树形结构

vxe-table2.0版本是提供深层查找功能的&#xff0c;因为他的数据源本身就是树形结构&#xff0c;所以深层查找查询出来也是树形结构。 但是vxe-table3.0版本为了做虚拟树功能&#xff0c;将整个数据源由树形垂直结构变成了扁平结构&#xff0c;便不提供深层查询功能&#xff0c…

代码随想录 Leetcode108. 将有序数组转换为二叉搜索树

题目&#xff1a; 代码(首刷自解 2024年1月31日&#xff09;&#xff1a; class Solution { public:TreeNode* recursion(vector<int>& nums, int left, int right) {if (left > right) return nullptr;int mid left (right-left)/2;TreeNode* node new TreeN…

Linux 入门基础知识(一)—— Linux的基本使用

Linux 入门基础知识 一、Linux的基本使用和配置1.1、终端1.2、消耗内存1.3、运行级别1.6、登录前欢迎语1.5、登录后欢迎语1.6、shell1.7、ps aux1.8、设置主机名1.9、whoami和who am i1.10、命令提示符 二、Linux执行命令的过程详解和命令类型2.1、命令执行2.2、hash缓存表2.3、…

在线摸头GIF生成系统源码

在线摸头GIF在线生成器html网页源码&#xff0c;可以点击选择文件按钮&#xff0c;或者直接将图片拖入&#xff0c;即可生成导出

Centos7安装原生Nginx并配置反向代理

一、背景 当我的应用程序需要集群化部署之时&#xff0c;必然需要一个反向代理&#xff0c;当然Nginx的大名&#xff0c;这里不做更多的介绍了&#xff0c;这里介绍一下Nginx常用的四大阵营 1 Ngnix 原生版本 nginx news 2 Nginx Plus 商用版&#xff08;收费的&#xff09…

STM32——USART

一、通信 1.1通信是什么&#xff1b; 通信是将一个设备的数据发送到另一个设备中&#xff0c;从而实现硬件的扩展&#xff1b; 1.2通信的目的是什么&#xff1b; 实现硬件的扩展-在STM32中集成了很多功能&#xff0c;例如PWM输出&#xff0c;AD采集&#xff0c;定时器等&am…

使用AKStream对接gb28181

优点&#xff1a;功能比较多&#xff0c;C#开发的&#xff0c;容易修改&#xff0c;内嵌入了zlmk流媒体服务品&#xff0c;启动简单 缺点&#xff1a;sip对摄像头兼容还有问题&#xff0c;大华接入非常不稳定&#xff0c;注册等待时间久&#xff0c;对海康是正常&#xff0c;占…

Unity_颜色空间GammaLinear

Unity_颜色空间Gamma&Linear Unity颜色空间的选择对于效果的影响具体有多大&#xff1f; 在ProjectSetting -> Player -> OtherSetting -> Rendering设置下的颜色空间选项卡选择颜色空间进行设置&#xff1a; 太深奥的解释一时半会看不懂&#xff0c;找见一个粗…

正则表达式与文本三剑客

目录 一、正则表达式 1. 定义 2. 字符匹配 3. 重复限定符 4. 位置锚点 5. 分组和引用 6. 扩展正则表达式 二、文本三剑客 1. grep 1.1 定义 1.2 语法 1.3 选项 1.4 示例 2. sed 2.1 定义 2.2 通式 2.3 选项 2.4 脚本格式&#xff08;脚本语法&#xff09; 2.…

###C语言程序设计-----C语言学习(8)## 斐波那契数列问题,素数问题,人数分配问题。

前言&#xff1a;感谢您的关注哦&#xff0c;我会持续更新编程相关知识&#xff0c;愿您在这里有所收获。如果有任何问题&#xff0c;欢迎沟通交流&#xff01;期待与您在学习编程的道路上共同进步。 今天&#xff0c;我们主要分享三个问题如何用C语言去求解&#xff0c;1.斐波…

京东平台数据哪里找?京东行业大盘数据(销售数据)查询软件推荐

电商时代&#xff0c;对于电商运营者来说&#xff0c;数据分析是提升竞争力、满足客户需求、保持盈利能力的关键手段。且随着电商的成熟及电商数据量的增长&#xff0c;数据分析的重要性也会越来越重要。 而在做数据分析时&#xff0c;运营者需要着重关注以下几组数据&#xf…

CISAW和CISP-PTE证书选择指南

&#x1f4e3;在信息安全领域&#xff0c;选择合适的证书可以为你的职业生涯增添光彩。很多从事信息渗透行业的朋友经常讨论CISP-PTE和CISAW之间的选择问题。今天就从4个方面带你详细了解这两张证书&#xff0c;帮你做出明智的选择&#xff01; 1️⃣证书的行业前景 &#x1f4…

8. 实现VLAN间的通信

文章目录 一. 初识VLAN通信1.1. VLAN的概述1.2. Dot1q 终结子接口(单臂路由 )1.3. VLANIF接口 二. 实验专题2.1. 实验1&#xff1a; Dotlq 终结子接口2.1.1. 实验目的2.1.2. 实验拓扑图2.1.3. 实验步骤&#xff08;1&#xff09;配置PC机的网络&#xff08;2&#xff09;交换机…