vue3权限树封装成组件

vue3权限树组件
功能:
1、勾选节点、自动把父节点勾选。
2、取消勾选、子节点全部取消勾选。检查父节点,如果只有这个子节点、遍历把父节点取消勾选
3、filter过滤不仅展示父节点、相关子节点同时展示
4、 高亮显示所有过滤数据

效果图
在这里插入图片描述
父组件引用

<template><Tree ref="treeRef" :data="data" style="width: 100%;"/>
</template>
<script setup lang="ts">import Tree from './tree.vue'const data = ref([])//1. 设置选中节点const taskCodes = res.data.permissionList.map(item => item.taskCode);treeRef.value!.setCheckedKeys(taskCodes);// 2. 获取选中的节点permissionList.value = treeRef.value!.getPermissionList()</script>

tree子组件

<template><span><el-input v-model="filterText" class="w-60 mb-2" placeholder="请输入菜单名称" /><el-tree style="width: 100%;height: calc(100vh - 370px);overflow-y: auto;" :data="data" ref="treeRef":props="defaultProps" node-key="id" default-expand-all :expand-on-click-node="false" :check-strictly="true"show-checkbox @check-change="handleCheckChange" @node-click="handleNodeClick":filter-node-method="filterNode" :render-content="renderNode"/></span>
</template>
<script setup lang="ts">
import { ref, defineProps, defineEmits, defineExpose } from 'vue'
import { useVModels } from "@vueuse/core";
const treeRef = ref()
const filterText = ref('')
const props = defineProps<{data: any;
}>();
const emit = defineEmits(["update:data"]);
const { data } = useVModels(props, emit);
const defaultProps = {children: 'children',label: 'label',disabled: 'disabled',
}
const handleCheckChange = (node, checked, indeterminate) => {if (checked) {ensureParentChecked(node);}else {checkParentUncheck(node);// 子级节点取消勾选checkChildUncheck(node);}
}
const handleNodeClick = (node, checked) => {if (!checked.checked) {ensureParentChecked(node);}else {checkParentUncheck(node);// 子级节点取消勾选checkChildUncheck(node);}
}
const ensureParentChecked = (node) => {treeRef.value!.setChecked(node, true, false);const parent = treeRef.value!.getNode(node)?.parent;if (parent && parent.data) {treeRef.value!.setChecked(parent.data, true, false);ensureParentChecked(parent.data);}
}
const checkParentUncheck = (node) => {treeRef.value!.setChecked(node, false, false);const parent = treeRef.value!.getNode(node)?.parent;if (!parent || !parent.data) return;const children = parent.childNodes;const allUnchecked = children.every(child => {return !child.checked && !child.indeterminate;});if (allUnchecked) {treeRef.value!.setChecked(parent.data, false, false);checkParentUncheck(parent.data);}
}
const checkChildUncheck = (node) => {const children = treeRef.value!.getNode(node)?.childNodes;if (children) {children.forEach(child => {treeRef.value!.setChecked(child, false, false);checkChildUncheck(child);});}
}
const filterNode = (value: string, data: any, node: any) => {if (!value) return truelet _array = [];//这里使用数组存储 只是为了存储值。getReturnNode(node, _array, value);let result = false;_array.forEach((item) => {result = result || item;});return result;
}const getReturnNode = (node, _array, value) =>{let isPass = node.data && node.data.label && node.data.label.indexOf(value) !== -1;isPass ? _array.push(isPass) : '';if (!isPass && node.level != 1 && node.parent) {getReturnNode(node.parent, _array, value);}
}
// 自定义节点渲染函数
const renderNode = (h: any, { node, data }: any) => {const label = data.label;const filterValue = filterText.value;if (filterValue && label.includes(filterValue)) {const parts = label.split(new RegExp(`(${filterValue})`, 'gi'));return h('span', {}, parts.map(part => {if (part.toLowerCase() === filterValue.toLowerCase()) {return h('span', { style: { color: 'red' } }, part);}return h('span', part);}));}return h('span', label);
};watch(filterText, (val) => {treeRef.value!.filter(val)
})
const getPermissionList = () => {return treeRef.value!.getCheckedNodes().map((item: { id: string; label: string }) => ({taskCode: item.id,taskName: item.label}));
}
const setCheckedKeys = (keys: string[]) => {treeRef.value!.setCheckedKeys(keys, false);
}defineExpose({getPermissionList, // 获取选中的权限列表setCheckedKeys,   // 设置选中的权限列表
})
</script>

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

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

相关文章

铨林接纸机学习记录1

光电开关学习做保养也是检查这些东西&#xff0c;包括气路有没漏气&#xff0c;固定件松动、轨道清洁之内刀座暂停光电I23刀座行程磁性开关&#xff0c;这个是安全警戒光电&#xff0c;驱动侧发射信号&#xff0c;操作侧接收刀座暂停光电正常运行是空白的&#xff0c;当出现遮挡…

47.分布式事务理论

所有的事务都必须满足ACID的原则: 原子性:事务中的所有操作,要么全部成功,要么全部失败。 一致性:要保证数据库内部完整性约束、声明性约束。 持久性:对数据库做的一切修改将永久保存,不管是否出现故障。 隔离性:对同一资源操作的事务不能同时发生。 分布式事务的…

【软考】进度管理知识库工具-挺方便

进度管理知识库 全面解析项目管理中的进度管理核心概念、工具、技术和最佳实践&#xff0c;帮助您高效管理项目时间线 六步流程法 规划进度管理 - 制定进度管理计划 定义活动 - 识别和记录项目活动 排列活动顺序 - 确定活动间的逻辑关系 估算活动持续时间 - 估算完成单项活动所…

PDF Replacer:高效便捷的PDF文档内容替换专家

在日常工作和学习中&#xff0c;PDF文件因其格式稳定、兼容性强而被广泛使用。然而&#xff0c;PDF文件的编辑和修改往往比其他文档格式更加复杂。PDF Replacer正是为了解决这一痛点而设计的&#xff0c;它是一款方便实用的PDF文档替换工具&#xff0c;能够帮助用户快速替换PDF…

Java中MybatisPlus使用多线程多数据源失效

Java中MybatisPlus使用多线程多数据源失效 文章目录Java中MybatisPlus使用多线程多数据源失效一&#xff1a;背景二&#xff1a;解决方法三&#xff1a;其他导致DS失效的条件3.1、Transactional一&#xff1a;背景 Mybatis-Plus使用异步任务后不能找到指定设置的DS数据库&…

机器翻译:模型微调(Fine-tuning)与调优详解

文章目录一、模型微调&#xff08;Fine-tuning&#xff09;概述1.1 模型微调是什么&#xff1f;1.2 为什么需要微调&#xff1f;1.3 微调的核心步骤1.4 选择微调策略1.5 训练与优化1.6 微调 vs. 从头训练&#xff08;From Scratch&#xff09;1.7 微调工具推荐二、模型调优&…

如何使用 AI 大语言模型解决生活中的实际小事情?

在 AI 技术飞速发展的今天&#xff0c;大语言模型早已不是实验室里的 “黑科技”&#xff0c;而是能实实在在融入日常生活的实用工具。从日常琐事处理到学习工作辅助&#xff0c;只需掌握简单的使用技巧&#xff0c;就能让 AI 成为你的 “生活小助手”。本文将通过具体场景案例…

佰力博检测与您探讨低温条件下如何测介电性能

在低温条件下测量介电性能时&#xff0c;需要综合考虑温度控制、样品制备、测试设备和测量方法等多个方面。1.温度控制与降温方法1.低温测试中&#xff0c;温度的精确控制是关键。低温测试通常采用液氮或液氮泵进行降温&#xff0c;以达到极低温度&#xff08;如-196C&#xff…

大规模分布式光伏并网后对电力系统的影响

光伏发电作为一种清洁、可再生的能源&#xff0c;正融入我们的电力系统&#xff0c;但是&#xff0c;随着新能源的发展&#xff0c;光伏发电的大规模并网&#xff0c;也给电网的稳定运行带来了新的挑战。下面小编将从四个方面&#xff0c;分别论述光伏并网对电网的影响以及如何…

LeetCode热题100--146.LRU缓存--中等

1. 题目 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则…

机器学习学习总结

一、机器学习到底是什么&#xff1f; 简单说&#xff0c;机器学习就是让计算机像人一样 “从经验中学习”。比如我们学骑自行车&#xff0c;摔多了就知道怎么保持平衡&#xff1b;计算机处理任务时&#xff0c;也能通过分析大量 “经验数据”&#xff0c;自己找到规律&#xff…

Boost库中boost::function函数使用详解

1. 函数作用 boost::function 是 Boost 库提供的一个 通用函数封装器&#xff0c;可用于存储、传递和调用任意可调用对象&#xff08;如普通函数、函数指针、Lambda、函数对象、成员函数指针等&#xff09;。它类似于 C11 及以上标准的 std::function。 作用总结&#xff1a; 可…

SQL Server安全删除数据并释放空间的技术方案

在SQL Server中执行大规模数据删除时&#xff0c;直接使用DELETE语句可能导致日志文件暴涨、事务阻塞和性能下降。以下提供一种安全删除数据并释放磁盘空间的完整方案&#xff1a; 方案核心步骤 -- 设置读未提交隔离级别&#xff08;避免锁竞争&#xff09; SET TRAN ISOLATION…

EgoVLA——根据第一视角的人类视频中训练的VLA模型:助力家具组装等人形灵巧操作任务的攻克(利用可穿戴手部追踪)

前言 我在此文《ForceVLA——将具备力感知的MoE整合进π0的动作专家中&#xff1a;从而融合“视觉 语言 力反馈”三者实现精密插拔》的开头说过&#xff0c;我司「七月在线」目前侧重以下两大本体的场景落地 人形层面&#xff0c;侧重 1.1 人形灵巧操作 1.2 人形展厅讲解机械…

厨具新风尚,解锁厨房新体验

在快节奏的现代生活中&#xff0c;厨房已不仅仅是烹饪的场所&#xff0c;更是家庭温馨与创意的源泉。一款好的厨具&#xff0c;不仅能让烹饪变得轻松愉悦&#xff0c;更能为餐桌增添无限风味。今天&#xff0c;就让我们一起走进厨具的新世界&#xff0c;解锁那些令人爱不释手的…

手机长焦进化史:攀过十年,终抵云巅

今天&#xff0c;华为相机解决方案专家熊谌飞在《长焦十年之路对谈》直播中&#xff0c;首次系统揭秘了华为手机长焦技术的十年进化史。从P9双摄到Pura 80系列“一镜双目”&#xff0c;每一代影像旗舰&#xff0c;都有一段鲜为人知的诞生秘辛。不少观众这才恍然大悟&#xff1a…

钙钛矿光伏:十年磨一剑,产业化突围路在何方?

2013年&#xff0c;一种具有高效太阳能转化率、高电荷传输率、低成本、制作简单等优点的新型太阳能电池材料——钙钛矿突然出现在大众视野。相比于又重又硬、转换效率通常只有22&#xff05;-26&#xff05;的传统晶体硅太阳能板&#xff0c;钙钛矿太阳能电池薄如蝉翼可弯曲&am…

断言:assert()的实用指南

目录 一、断言概述 二、基本用法 三、工作原理 四、断言的优点 五、启用和禁用断言 六、性能考虑 七、最佳实践 八、示例代码 一、断言概述 assert.h 头文件定义了宏 assert()&#xff0c;用于在运行时验证程序是否符合指定条件。如果条件不满足&#xff0c;程序会报错并…

开发避坑指南(27):Vue3中高效安全修改列表元素属性的方法

需求 Vue3 中如何遍历list并修改list元素的属性的值&#xff1f; 解决办法 1、‌使用 map 方法‌ const newList list.value.map(item > {return {...item,modifiedProperty: newValue // 修改的属性名称和属性值} })Vue 中的 map() 函数是 JavaScript 数组的高阶函数&…

L4 级别自动驾驶 硬件架构设计

L4 级自动驾驶&#xff08;根据 SAE 标准&#xff0c;属于 “高度自动化”&#xff09;的核心是系统在特定场景下&#xff08;如城市道路、高速路&#xff09;可完全自主完成驾驶任务&#xff0c;无需驾驶员干预&#xff0c;且在系统失效时能自动实现安全降级。其硬件架构需满足…