Bläddra i källkod

fix(tree): fix `checkAll` effects `disabled` node

无木 3 år sedan
förälder
incheckning
ddd1893b11
3 ändrade filer med 21 tillägg och 1 borttagningar
  1. 1 0
      CHANGELOG.zh_CN.md
  2. 2 1
      src/components/Tree/src/Tree.vue
  3. 18 0
      src/components/Tree/src/useTree.ts

+ 1 - 0
CHANGELOG.zh_CN.md

@@ -9,6 +9,7 @@
 - **ImgRotateDragVerify** 修复组件`resume`方法无法调用的问题
 - **TableAction** 修复 stopButtonPropagation 属性某些情况下不起作用的问题
 - **PageWrapper** 修复`class`属性无效的问题
+- **BasicTree** 修复`checkAll`方法会影响到`disabled`状态节点的问题
 - **BasicTable**
   - 修复可编辑单元格不支持`ellipsis`配置的问题
   - 修复全屏模式下看不到子组件弹出层(popconfirm 以及 select、treeSelect 等编辑组件)的问题

+ 2 - 1
src/components/Tree/src/Tree.vue

@@ -127,6 +127,7 @@
         updateNodeByKey,
         getAllKeys,
         getChildrenKeys,
+        getEnabledKeys,
       } = useTree(treeDataRef, getReplaceFields);
 
       function getIcon(params: Recordable, icon?: string) {
@@ -180,7 +181,7 @@
       }
 
       function checkAll(checkAll: boolean) {
-        state.checkedKeys = checkAll ? getAllKeys() : ([] as Keys);
+        state.checkedKeys = checkAll ? getEnabledKeys() : ([] as Keys);
       }
 
       function expandAll(expandAll: boolean) {

+ 18 - 0
src/components/Tree/src/useTree.ts

@@ -26,6 +26,23 @@ export function useTree(
     }
     return keys as Keys;
   }
+  // get keys that can be checked and selected
+  function getEnabledKeys(list?: TreeDataItem[]) {
+    const keys: string[] = [];
+    const treeData = list || unref(treeDataRef);
+    const { key: keyField, children: childrenField } = unref(getReplaceFields);
+    if (!childrenField || !keyField) return keys;
+
+    for (let index = 0; index < treeData.length; index++) {
+      const node = treeData[index];
+      node.disabled !== true && node.selectable !== false && keys.push(node[keyField]!);
+      const children = node[childrenField];
+      if (children && children.length) {
+        keys.push(...(getEnabledKeys(children) as string[]));
+      }
+    }
+    return keys as Keys;
+  }
 
   function getChildrenKeys(nodeKey: string | number, list?: TreeDataItem[]): Keys {
     const keys: Keys = [];
@@ -169,5 +186,6 @@ export function useTree(
     updateNodeByKey,
     getAllKeys,
     getChildrenKeys,
+    getEnabledKeys,
   };
 }