Commit d97aa927417bf45a7c127ecfa9b8e835b6b68855
Committed by
GitHub
1 parent
480cfb91
fix(comp-tree): support comp-tree-foreach stop,add insertNodesByKey (#818)
Co-authored-by: git <lixiaokang215@163.com>
Showing
3 changed files
with
41 additions
and
2 deletions
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<T = any>( |
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 | } | ... | ... |