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

在vue3中,手写父子关联,勾选子级父级关联,取消只取消当前子级,父节点不动

树形控件选择子级勾选父级,以及所有子级, 取消勾选仅取消子级

在项目中,可能会遇到这种场景,比如权限配置的时候,页面权限和菜单权限以tree的形式来配置,而且不用半选,菜单在页面的下面,转载请说明出处!!!!

比如说只想勾选页面,而不想勾按钮权限的话,这样是实现不了的,这样我们只能自己实现了,当然,如果不闲麻烦的话可以直接在el-tree上设置

check-strictly  设置父子不关联

如果只设置这个属性的话。勾选的子节点不会被选中,关联的父节点也不会被选中

,但是我在这已经给大家做好了直接上代码,有用的话点个赞

这是html部分代码,由于是vue3写的等下我只展示用到的部分代码 

data就是树形图数据

咱就只看check的事件针对做处理就好了

 <el-tree:default-expand-all="true"show-checkboxref="pSelectTree":render-after-expand="false":data="allPermissionDataSource.format":props="treeProps"@check="onPTreeCheck"check-strictlynodeKey="id"></el-tree>

 这个是点击复选框触发的事件,里面用到了两个参数,一个是当前点击的内容,另外用到了

const onPTreeCheck = (_currentData: any, checkData: any) => {// 使用示例//选之前先看之前有没有选中
//setCheckedKeys 是存放选中的keylet flag = lastCheckdKey.value.includes(_currentData.id);// console.log(flag, "iiiii");lastCheckdKey.value = updateCheckedKeys(allPermissionDataSource.value.format,lastCheckdKey.value,_currentData.id,flag);// console.log(lastCheckdKey.value, "lastCheckdKey.value");pSelectTree.value.setCheckedKeys(lastCheckdKey.value);
//设置el-tree选中这些key
};

下面是调用的方法,封装了几个辅助函数

function updateCheckedKeys(treeData, checkedKeys, nodeId, isChecked) {let newCheckedKeys = new Set(checkedKeys);// 辅助函数,用于向上查找并添加所有父节点的IDfunction findParentIds(treeData, currentId=nodeId, includeSelf = true) {  let parentIds = [];  // 辅助函数,递归地查找父节点  function traverseTree(nodes, targetId) {  // console.log(nodes,targetId,'targetId');for (let node of nodes) {  if (node.id === targetId) {  // 如果找到了目标节点,并且需要包含自身,则添加它  if (includeSelf) {  parentIds.unshift(targetId); // 在数组开头添加,以保持顺序  }  // 递归地向上查找父节点  if (node.parentId !== null && node.parentId !== undefined) { // 假设parentId为null或undefined表示没有父节点  traverseTree(treeData, node.parentId); // 注意:这里我们遍历整个treeData来查找parentId,但在实际中可能更高效的方法是使用一个map来存储id到节点的映射  }  return; // 找到后退出循环  }  // 如果当前节点有子节点,则递归检查它们  if (node.children) {  traverseTree(node.children, targetId);  }  }  }  // 从根节点开始遍历树  traverseTree(treeData, currentId);  return parentIds;  
}  // 辅助函数,用于查找并添加所有子节点的IDfunction addChildrenIds(nodeArray, parentId) {for (let node of nodeArray) {// c 输出当前节点的 IDif (node.id === parentId) {//  如果找到匹配的节点,输出信息newCheckedKeys.add(parentId);if (node.children) {for (let child of node.children) {newCheckedKeys.add(child.id);addChildrenIds(node.children, child.id); // 递归地添加子节点的 ID}} else {// 如果节点没有子节点,输出信息}return; // 找到匹配的节点后返回,避免不必要的遍历(但这取决于您是否想继续检查其他节点)}// 如果当前节点没有匹配的子节点,但包含子节点数组,则递归检查这些子节点if (node.children) {addChildrenIds(node.children, parentId);}}//  如果在这一分支中没有找到匹配的节点,输出信息}function removeCheckedKeysAndChildren(nodeArray, nodeIdToRemove) {for (let node of nodeArray) {// 输出当前节点的 IDif (node.id === nodeIdToRemove) {// 如果找到匹配的节点,输出信息newCheckedKeys.delete(nodeIdToRemove);if (node.children) {for (let child of node.children) {newCheckedKeys.delete(child.id);removeCheckedKeysAndChildren(node.children, child.id); // 递归地添加子节点的 ID}} else {// 如果节点没有子节点,输出信息}return; // 找到匹配的节点后返回,避免不必要的遍历(但这取决于您是否想继续检查其他节点)}// 如果当前节点没有匹配的子节点,但包含子节点数组,则递归检查这些子节点if (node.children) {removeCheckedKeysAndChildren(node.children, nodeIdToRemove);}}}if (!isChecked) {// 如果当前节点不在checkedKeys中,则添加它、它的所有父节点及其所有子节点findParentIds(treeData,nodeId); // 先添加所有父节点//父节点关联let parentArr=findParentIds(treeData)for (let i = 0; i < parentArr.length; i++) {newCheckedKeys.add(parentArr[i]);}newCheckedKeys.add(nodeId); // 然后添加当前节点本身addChildrenIds(treeData, nodeId); // 最后添加所有子节点// console.log(newCheckedKeys, "newCheckedKeys");} else {// 如果当前节点在checkedKeys中,则移除它removeCheckedKeysAndChildren(treeData,nodeId);// console.log(newCheckedKeys, "newCheckedKeys");}return [...newCheckedKeys];
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • nodejs模板引擎(一)
  • react + redux 状态管理操作
  • Kafka基础入门篇(深度好文)
  • 柳永,市井生活的吟游者
  • HDFS体系架构文件写入/下载流程
  • EnableFeignClients详解
  • 函数的形状怎么定义?
  • 用Qwt进行图表和数据可视化开发
  • GD32F303之CAN通信
  • EasyExcel批量读取Excel文件数据导入到MySQL表中
  • 二分查找中while的判断条件
  • 11.FreeRTOS_事件组
  • 使用Python和MediaPipe实现手势虚拟鼠标控制
  • 自动驾驶论文总结
  • SQL 索引
  • 《Javascript数据结构和算法》笔记-「字典和散列表」
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • 230. Kth Smallest Element in a BST
  • AngularJS指令开发(1)——参数详解
  • CODING 缺陷管理功能正式开始公测
  • Cumulo 的 ClojureScript 模块已经成型
  • ECS应用管理最佳实践
  • JSONP原理
  • Kibana配置logstash,报表一体化
  • laravel with 查询列表限制条数
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • macOS 中 shell 创建文件夹及文件并 VS Code 打开
  • miniui datagrid 的客户端分页解决方案 - CS结合
  • PHP变量
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • springMvc学习笔记(2)
  • vue:响应原理
  • vue--为什么data属性必须是一个函数
  • 产品三维模型在线预览
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 多线程事务回滚
  • 高程读书笔记 第六章 面向对象程序设计
  • 关于List、List?、ListObject的区别
  • 基于web的全景—— Pannellum小试
  • 简析gRPC client 连接管理
  • 排序算法之--选择排序
  • 区块链分支循环
  • 硬币翻转问题,区间操作
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • MyCAT水平分库
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 国内开源镜像站点
  • 树莓派用上kodexplorer也能玩成私有网盘
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # 详解 JS 中的事件循环、宏/微任务、Primise对象、定时器函数,以及其在工作中的应用和注意事项
  • #QT(QCharts绘制曲线)
  • $refs 、$nextTic、动态组件、name的使用