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

效果

在这里插入图片描述

原理分析

  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 

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

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

相关文章

解决打开页面显示源代码和乱码

用系统记事本打开 点击文件》另存为 选择编码&#xff1a;ANSI 保存》要替换它吗?》是 重新打开页面&#xff0c;显示正常&#xff0c;解决问题。

D2025——双通道音频功率放大电路,外接元件少, 通道分离性好,3V 的低压下可正常使用

D2025 为立体声音频功率放大集成电路&#xff0c;适用于各类袖珍或便携式立体声 收录机中作功率放放大器。 D2025 采用 DIP16 封装形式。 主要特点&#xff1a;  适用于立体声或 BTL 工作模式  外接元件少  通道分离性好  电源电压范围宽&#xff08;3V~12V…

Jenkins自动化打包

Jenkins自动化打包 下载安装 我们直接从官网https://www.jenkins.io/download/ 下载所需的Jenkins文件 如上图所示, 选择Windows版本,下面就是一路安装即可,需要注意的是,选择作为系统服务选项, 不要自己设置账号密码登录. Web配置 安装完根据提示在浏览器打开 http://lo…

01、全文检索 ------ 反向索引库 与 Lucene 的介绍

目录 全文检索 ------ 反向索引库 与 LuceneSQL模糊查询的问题反向索引库反向索引库的查询 Lucene&#xff08;全文检索技术&#xff09;Lucene能做什么Lucene存在的问题Solr 和 Elasticsearch 与 Lucene 的关系 全文检索 ------ 反向索引库 与 Lucene MySQL一些索引词汇解释 …

故障诊断 | 一文解决,BP神经网络的故障诊断(Matlab)

文章目录 效果一览文章概述专栏介绍模型描述源码设计参考资料效果一览 文章概述 故障诊断 | 一文解决,BP神经网络的故障诊断(Matlab) 专栏介绍 订阅【故障诊断】专栏,不定期更新机器学习和深度学习在故障诊断中的应用;订阅

52个值得收藏的无代码AI平台【2024】

“无代码”不仅仅是炒作。 这是一场革命。 在无代码之前&#xff0c;如果你想制作一个网站&#xff0c;你需要一名技术网络开发人员。 现在&#xff0c;你可以使用 Bubble、Webflow、Carrd 或无数其他可视化工具。 人工智能领域也发生了同样的情况。 在无代码之前&#xff0c;你…

国网四川宜宾供电公司:基于“RPA+AI”融合技术的电网设备隐患缺陷智能化识别应用

推荐单位&#xff1a;国网四川省电力公司宜宾供电公司 本文作者&#xff1a;杨鑫、唐龙、钟睿、李小航、孙雪冬 摘 要&#xff1a;为推进电力企业生产业务数字化转型&#xff0c;提高基层班组数字化运维水平。本文通过一线班组对变电站视频巡视、设备故障判断应用场景需求分析…

搭建幻兽帕鲁需要什么样的服务器

作为一个开放世界生存制造类游戏《幻兽帕鲁》收获了空前绝后的热度&#xff0c;玩家们在游戏中通过在地图上捕捉收集到的“帕鲁”进行训练&#xff0c;合理利用他们的能力进行战斗&#xff0c;建立自己的家园、开辟新的世界、解锁新的冒险情节&#xff0c;获取更多游戏信息增加…

langchain+xray:prompt控制漏洞扫描

写在前面 xray是长亭推出的一款漏洞扫描工具。 langchain是调用LLM大模型完成自动化任务的框架。 本篇文章是对langchain自定义工具的探索&#xff0c;通过编写一个xray调用的工具&#xff0c;联合ChatGPT对xray进行调用&#xff0c;实现对目标的漏洞扫描。 xray功能分析 …

悄悄话 - 华为OD统一考试

OD统一考试&#xff08;C卷&#xff09; 分值&#xff1a; 100分 题解&#xff1a; Java / Python / C 题目描述 给定一个二叉树&#xff0c;每个节点上站一个人&#xff0c;节点数字表示父节点到该节点传递悄悄话需要花费的时间。 初始时&#xff0c;根节点所在位置的人有一…

vue3.0 + 动态加载组件 + 全局注册组件

首先 vue 动态加载组件使用的是 component 标签&#xff0c;并通过设置组件的is 属性来指定要渲染的组件。例如&#xff1a; <component :is"currentComponent"></component>其中&#xff0c;currentComponent 是一个变量&#xff0c;它的值可以是以下几…

【图论】【状态压缩】【树】【深度优先搜索】1617. 统计子树中城市之间最大距离

作者推荐 【动态规划】【字符串】【行程码】1531. 压缩字符串 本文涉及的知识点 图论 深度优先搜索 状态压缩 树 LeetCode1617. 统计子树中城市之间最大距离 给你 n 个城市&#xff0c;编号为从 1 到 n 。同时给你一个大小为 n-1 的数组 edges &#xff0c;其中 edges[i] …

FPGA工程师的重要技能

写代码是最难的嘛&#xff1f; 不是 会调试代码才是你的闪光点&#xff01;&#xff01; 很多人觉得写代码是最重要的但这不是一个优秀的FPGA工程师的核心竞争力 企业工作也更加注重你调试代码的能力 因此我们的课程老师对课程设计也是很有要求的 写代码是最难的嘛&#…

HT71663 13V,12A全集成同步升压转换器 中文资料 规格书

HT71663是一款高功率、全集成升压转换器&#xff0c;集成16mΩ功率开关管和23mΩ同步整流管&#xff0c;为便携式系统提供G效的小尺寸处理方案。 HT71663具有2.7V至13V宽输入电压范围&#xff0c;可为采用单节或两节锂电池的应用提供支持。该器件具备10A开关电流能力&#xff…

CHS_05.2.3.4_1+信号量机制

CHS_05.2.3.4_1信号量机制 知识总览信号量机制信号量机制——整型信号量信号量机制——记录型信号量知识回顾 在这个小节中 我们会学习信号量 机制这个极其重要的知识点 知识总览 在考研当中 我们需要掌握两种类型的信号量 一种是整形信号量 另一种是记录型信号量 我们会在后面…

数字孪生模型优化平台

老子云模型优化服务平台 一、模型优化 使用单模型轻量化、格式转换、倾斜摄影轻量化服务。 1、格式转换 只需上传原始单模型文件&#xff0c;就能在云端自动发起转换。 服务介绍&#xff1a; 支持格式输出为FBX、OBJ、STL、STP格式&#xff08;其他输出格式陆续上线中&…

企业级大数据安全架构(七)服务安全

作者&#xff1a;楼高 在企业级大数据安全方案中&#xff0c;本节主要介绍服务安全问题&#xff0c;引入kerberos认证机制&#xff0c;目前直接对接kerberos使用较多&#xff0c;这里我们使用FreeIPA来集成kerberos FreeIPA官网下载地址&#xff1a;https://www.freeipa.org/p…

Android systemui 编译

目录 简介&#xff1a; 一、步骤 二、下载源码 三、环境配置 四、确定好需要编译版本 五、编译SystemUI 步骤1&#xff1a;进入源代码目录 步骤2&#xff1a;初始化编译环境 步骤3&#xff1a;选择目标设备 步骤4&#xff1a;编译SystemUI 步骤5&#xff1a;查找生成…

指针的深入了解6

1.回调函数 回调函数就是一个通过函数指针调用的函数。 如果你把函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调用其所指向的函数 时&#xff0c;被调用的函数就是回调函数。回调函数不是由该函数的实现方直接调用&#xff0…

【Tomcat与网络5】再论Tomcat的工作过程与两种经典的设计模式

前面两篇&#xff0c;我们重点分析了Tomcat的容器和连接器的基本设计&#xff0c;今天我们来看一下两个机构如何在service的调度下进行协同工作的。 目录 1.模板模式与Tomcat的重用性设计 2.观察者模式与Tomcat可扩展性设计 1.模板模式与Tomcat的重用性设计 首先&#xff0…