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

vue3渲染el-tree组件,给默认选中的节点,禁用所有子节点

实现逻辑:给默认选中节点的所有子节点添加一个disabled属性,以此禁用子节点。

编写代码

<template>
	<el-tree :props="{ children: 'children', label: 'name' }" :data="treeListData" show-checkbox node-key="id" ref="treeRef"
		check-strictly :default-expand-all="true" :default-checked-keys="checkedIdArr" @check-change="handleCheckChange" />
</template>

<script lang="ts">
import { toRefs, reactive, onMounted, defineComponent, getCurrentInstance } from 'vue';

export default defineComponent({
	setup() {
		// 页面加载时
		onMounted(() => {
			data.treeListData = setSubDisabled(data.treeListData, data.checkedIdArr)
		});

		const { proxy }: any = getCurrentInstance();

		const data = reactive({
			treeListData: [
				{
					id: 1,
					name: "一级1",
					pid: 0,
					is_level: 1,
					children: [
						{
							id: 2,
							name: "二级1",
							pid: 1,
							is_level: 2,
							children: [
								{
									id: 9,
									name: "三级1",
									pid: 1,
									is_level: 3,
								}
							]
						}
					]
				},
				{
					id: 3,
					name: "一级2",
					pid: 0,
					is_level: 1,
					children: [
						{
							id: 4,
							name: "二级1",
							pid: 3,
							is_level: 2,
							children: [
								{
									id: 5,
									name: "三级1",
									pid: 4,
									is_level: 3,
									children: [
										{
											id: 6,
											name: "四级1",
											pid: 5,
											is_level: 4,
											children: [
												{
													id: 7,
													name: "五级1",
													pid: 6,
													is_level: 5,
												}
											]
										}
									]
								}
							]
						},
						{
							id: 8,
							name: "二级2",
							pid: 3,
							is_level: 2,
						}
					]
				},
			] as any[],
			checkedIdArr: [1, 4]
		});

		function setSubDisabled(nodes: any[], checkedIdArr: number[]) {
			nodes.forEach((node: any) => {
				if (checkedIdArr.includes(node.id)) {
					function setDisabled(sonNode: any[]) {
						sonNode && sonNode.forEach((v: any) => {
							v.disabled = true
							if (v.children && v.children.length > 0) {
								setDisabled(v.children)
							}
						})
					}
					setDisabled(node.children)
				}
				if (node.children && node.children.length > 0) {
					setSubDisabled(node.children, checkedIdArr);
				}
			})
			return nodes
		}

		const handleCheckChange = (curObj: any, checked: boolean,) => {
			let getCheckedKeys = proxy.$refs.treeRef.getCheckedKeys()
			let newArr = disableSubNodes(curObj.children, checked, getCheckedKeys)

			data.checkedIdArr = newArr
			proxy.$refs.treeRef.setCheckedKeys(newArr)
		}

		const disableSubNodes = (nodes: any, checked: boolean, checkedKeys: number[]) => {
			nodes?.length > 0 && nodes.forEach((node: any) => {
				checkedKeys = checkedKeys.filter((v: number) => v !== node.id)
				node.disabled = checked;
				if (node.children && node.children.length > 0) {
					disableSubNodes(node.children, checked, checkedKeys);
				}
			});
			return checkedKeys
		}

		return {
			...toRefs(data), handleCheckChange
		};
	},
});
</script>

效果图


http://www.kler.cn/a/443011.html

相关文章:

  • 金融项目实战 02|接口测试分析、设计以及实现
  • gesp(C++四级)(11)洛谷:B4005:[GESP202406 四级] 黑白方块
  • 【Docker】docker compose 安装 Redis Stack
  • LabVIEW软件Bug的定义与修改
  • 一块钱的RISC-V 32位芯片
  • js实现一个可以自动重链的websocket客户端
  • C# 实现 WinForm 全屏置顶
  • systemverilog中的循环(loop)
  • 批量DWG文件转换低版本(CAD图转低版本)——c#插件实现
  • TCP 三次握手四次挥手
  • Jmeter的性能测试
  • 汽车供应链 “剧变”开始,“智能感知潜在龙头”诞生
  • 自己构建的python如何可以通过 PyPI安装
  • 【多模态】swift框架使用qwen2-vl
  • C# OpenCvSharp DNN 实现百度网盘AI大赛-表格检测第2名方案第一部分-表格边界框检测
  • 网络协议详解---TCP、HTTP、WebSocket、socket、轮询等
  • Unity3D Shader实现黑洞效果详解
  • AI 语言模型产业的投资困境与发展困境分析
  • 细说STM32F407单片机SPI基础知识
  • 【HAL库】STM32CubeMX开发----STM32F407----Time定时器中断实验
  • Ubuntu 配置静态 IP 地址
  • Excel工作表不能相互移动和复制?有何解决方法?
  • 【系统架构设计师】真题论文: 论软件设计方法及其应用(包括解题思路和素材)
  • 神州数码DCME-320 online_list.php存在任意文件读取漏洞
  • 基于物联网的智能插座云平台安全检测系统 WIFI云平台MQTT协议
  • Python机器学习笔记(九、无监督学习-预处理与缩放)