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,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<T = any>( | @@ -147,7 +147,10 @@ export function forEach<T = any>( | ||
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 | } |