当前位置:   article > 正文

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

checkedkeys中父子关联

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

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

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

check-strictly  设置父子不关联

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

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

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

data就是树形图数据

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

  1. <el-tree
  2. :default-expand-all="true"
  3. show-checkbox
  4. ref="pSelectTree"
  5. :render-after-expand="false"
  6. :data="allPermissionDataSource.format"
  7. :props="treeProps"
  8. @check="onPTreeCheck"
  9. check-strictly
  10. nodeKey="id"
  11. ></el-tree>

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

  1. const onPTreeCheck = (_currentData: any, checkData: any) => {
  2. // 使用示例
  3. //选之前先看之前有没有选中
  4. //setCheckedKeys 是存放选中的key
  5. let flag = lastCheckdKey.value.includes(_currentData.id);
  6. // console.log(flag, "iiiii");
  7. lastCheckdKey.value = updateCheckedKeys(
  8. allPermissionDataSource.value.format,
  9. lastCheckdKey.value,
  10. _currentData.id,
  11. flag
  12. );
  13. // console.log(lastCheckdKey.value, "lastCheckdKey.value");
  14. pSelectTree.value.setCheckedKeys(lastCheckdKey.value);
  15. //设置el-tree选中这些key
  16. };

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

  1. function updateCheckedKeys(treeData, checkedKeys, nodeId, isChecked) {
  2. let newCheckedKeys = new Set(checkedKeys);
  3. // 辅助函数,用于向上查找并添加所有父节点的ID
  4. function findParentIds(treeData, currentId=nodeId, includeSelf = true) {
  5. let parentIds = [];
  6. // 辅助函数,递归地查找父节点
  7. function traverseTree(nodes, targetId) {
  8. // console.log(nodes,targetId,'targetId');
  9. for (let node of nodes) {
  10. if (node.id === targetId) {
  11. // 如果找到了目标节点,并且需要包含自身,则添加它
  12. if (includeSelf) {
  13. parentIds.unshift(targetId); // 在数组开头添加,以保持顺序
  14. }
  15. // 递归地向上查找父节点
  16. if (node.parentId !== null && node.parentId !== undefined) { // 假设parentId为null或undefined表示没有父节点
  17. traverseTree(treeData, node.parentId); // 注意:这里我们遍历整个treeData来查找parentId,但在实际中可能更高效的方法是使用一个map来存储id到节点的映射
  18. }
  19. return; // 找到后退出循环
  20. }
  21. // 如果当前节点有子节点,则递归检查它们
  22. if (node.children) {
  23. traverseTree(node.children, targetId);
  24. }
  25. }
  26. }
  27. // 从根节点开始遍历树
  28. traverseTree(treeData, currentId);
  29. return parentIds;
  30. }
  31. // 辅助函数,用于查找并添加所有子节点的ID
  32. function addChildrenIds(nodeArray, parentId) {
  33. for (let node of nodeArray) {
  34. // c 输出当前节点的 ID
  35. if (node.id === parentId) {
  36. // 如果找到匹配的节点,输出信息
  37. newCheckedKeys.add(parentId);
  38. if (node.children) {
  39. for (let child of node.children) {
  40. newCheckedKeys.add(child.id);
  41. addChildrenIds(node.children, child.id); // 递归地添加子节点的 ID
  42. }
  43. } else {
  44. // 如果节点没有子节点,输出信息
  45. }
  46. return; // 找到匹配的节点后返回,避免不必要的遍历(但这取决于您是否想继续检查其他节点)
  47. }
  48. // 如果当前节点没有匹配的子节点,但包含子节点数组,则递归检查这些子节点
  49. if (node.children) {
  50. addChildrenIds(node.children, parentId);
  51. }
  52. }
  53. // 如果在这一分支中没有找到匹配的节点,输出信息
  54. }
  55. function removeCheckedKeysAndChildren(nodeArray, nodeIdToRemove) {
  56. for (let node of nodeArray) {
  57. // 输出当前节点的 ID
  58. if (node.id === nodeIdToRemove) {
  59. // 如果找到匹配的节点,输出信息
  60. newCheckedKeys.delete(nodeIdToRemove);
  61. if (node.children) {
  62. for (let child of node.children) {
  63. newCheckedKeys.delete(child.id);
  64. removeCheckedKeysAndChildren(node.children, child.id); // 递归地添加子节点的 ID
  65. }
  66. } else {
  67. // 如果节点没有子节点,输出信息
  68. }
  69. return; // 找到匹配的节点后返回,避免不必要的遍历(但这取决于您是否想继续检查其他节点)
  70. }
  71. // 如果当前节点没有匹配的子节点,但包含子节点数组,则递归检查这些子节点
  72. if (node.children) {
  73. removeCheckedKeysAndChildren(node.children, nodeIdToRemove);
  74. }
  75. }
  76. }
  77. if (!isChecked) {
  78. // 如果当前节点不在checkedKeys中,则添加它、它的所有父节点及其所有子节点
  79. findParentIds(treeData,nodeId); // 先添加所有父节点
  80. //父节点关联
  81. let parentArr=findParentIds(treeData)
  82. for (let i = 0; i < parentArr.length; i++) {
  83. newCheckedKeys.add(parentArr[i]);
  84. }
  85. newCheckedKeys.add(nodeId); // 然后添加当前节点本身
  86. addChildrenIds(treeData, nodeId); // 最后添加所有子节点
  87. // console.log(newCheckedKeys, "newCheckedKeys");
  88. } else {
  89. // 如果当前节点在checkedKeys中,则移除它
  90. removeCheckedKeysAndChildren(treeData,nodeId);
  91. // console.log(newCheckedKeys, "newCheckedKeys");
  92. }
  93. return [...newCheckedKeys];
  94. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/827205
推荐阅读