Commit d97aa927417bf45a7c127ecfa9b8e835b6b68855

Authored by bbkkkk8
Committed by GitHub
1 parent 480cfb91

fix(comp-tree): support comp-tree-foreach stop,add insertNodesByKey (#818)

Co-authored-by: git <lixiaokang215@163.com>
src/components/Tree/src/typing.ts
@@ -31,6 +31,7 @@ export interface TreeActionType { @@ -31,6 +31,7 @@ export interface TreeActionType {
31 getCheckedKeys: () => CheckKeys; 31 getCheckedKeys: () => CheckKeys;
32 filterByLevel: (level: number) => void; 32 filterByLevel: (level: number) => void;
33 insertNodeByKey: (opt: InsertNodeParams) => void; 33 insertNodeByKey: (opt: InsertNodeParams) => void;
  34 + insertNodesByKey: (opt: InsertNodeParams) => void;
34 deleteNodeByKey: (key: string) => void; 35 deleteNodeByKey: (key: string) => void;
35 updateNodeByKey: (key: string, node: Omit<TreeDataItem, 'key'>) => void; 36 updateNodeByKey: (key: string, node: Omit<TreeDataItem, 'key'>) => void;
36 } 37 }
src/components/Tree/src/useTree.ts
@@ -87,11 +87,39 @@ export function useTree( @@ -87,11 +87,39 @@ export function useTree(
87 if (treeItem[keyField] === parentKey) { 87 if (treeItem[keyField] === parentKey) {
88 treeItem[childrenField] = treeItem[childrenField] || []; 88 treeItem[childrenField] = treeItem[childrenField] || [];
89 treeItem[childrenField][push](node); 89 treeItem[childrenField][push](node);
  90 + return true;
90 } 91 }
91 }); 92 });
92 treeDataRef.value = treeData; 93 treeDataRef.value = treeData;
93 } 94 }
  95 + /**
  96 + * 批量添加节点
  97 + */
  98 + function insertNodesByKey({ parentKey = null, list, push = 'push' }: InsertNodeParams) {
  99 + const treeData: any = cloneDeep(unref(treeDataRef));
  100 + if (!list || list.length < 1) {
  101 + return;
  102 + }
  103 + if (!parentKey) {
  104 + for (let i = 0; i < list.length; i++) {
  105 + treeData[push](list[i]);
  106 + }
  107 + } else {
  108 + const { key: keyField, children: childrenField } = unref(getReplaceFields);
  109 + if (!childrenField || !keyField) return;
94 110
  111 + forEach(treeData, (treeItem) => {
  112 + if (treeItem[keyField] === parentKey) {
  113 + treeItem[childrenField] = treeItem[childrenField] || [];
  114 + for (let i = 0; i < list.length; i++) {
  115 + treeItem[childrenField][push](list[i]);
  116 + }
  117 + treeDataRef.value = treeData;
  118 + return true;
  119 + }
  120 + });
  121 + }
  122 + }
95 // Delete node 123 // Delete node
96 function deleteNodeByKey(key: string, list?: TreeDataItem[]) { 124 function deleteNodeByKey(key: string, list?: TreeDataItem[]) {
97 if (!key) return; 125 if (!key) return;
@@ -111,5 +139,12 @@ export function useTree( @@ -111,5 +139,12 @@ export function useTree(
111 } 139 }
112 } 140 }
113 } 141 }
114 - return { deleteNodeByKey, insertNodeByKey, filterByLevel, updateNodeByKey, getAllKeys }; 142 + return {
  143 + deleteNodeByKey,
  144 + insertNodeByKey,
  145 + insertNodesByKey,
  146 + filterByLevel,
  147 + updateNodeByKey,
  148 + getAllKeys,
  149 + };
115 } 150 }
src/utils/helper/treeHelper.ts
@@ -147,7 +147,10 @@ export function forEach&lt;T = any&gt;( @@ -147,7 +147,10 @@ export function forEach&lt;T = any&gt;(
147 const list: any[] = [...tree]; 147 const list: any[] = [...tree];
148 const { children } = config; 148 const { children } = config;
149 for (let i = 0; i < list.length; i++) { 149 for (let i = 0; i < list.length; i++) {
150 - func(list[i]); 150 + //func 返回true就终止遍历,避免大量节点场景下无意义循环,引起浏览器卡顿
  151 + if (func(list[i])) {
  152 + return;
  153 + }
151 children && list[i][children] && list.splice(i + 1, 0, ...list[i][children]); 154 children && list[i][children] && list.splice(i + 1, 0, ...list[i][children]);
152 } 155 }
153 } 156 }