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 31 getCheckedKeys: () => CheckKeys;
32 32 filterByLevel: (level: number) => void;
33 33 insertNodeByKey: (opt: InsertNodeParams) => void;
  34 + insertNodesByKey: (opt: InsertNodeParams) => void;
34 35 deleteNodeByKey: (key: string) => void;
35 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 87 if (treeItem[keyField] === parentKey) {
88 88 treeItem[childrenField] = treeItem[childrenField] || [];
89 89 treeItem[childrenField][push](node);
  90 + return true;
90 91 }
91 92 });
92 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 123 // Delete node
96 124 function deleteNodeByKey(key: string, list?: TreeDataItem[]) {
97 125 if (!key) return;
... ... @@ -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 147 const list: any[] = [...tree];
148 148 const { children } = config;
149 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 154 children && list[i][children] && list.splice(i + 1, 0, ...list[i][children]);
152 155 }
153 156 }
... ...