From d97aa927417bf45a7c127ecfa9b8e835b6b68855 Mon Sep 17 00:00:00 2001 From: bbkkkk8 <379266761@qq.com> Date: Sun, 27 Jun 2021 00:01:38 +0800 Subject: [PATCH] fix(comp-tree): support comp-tree-foreach stop,add insertNodesByKey (#818) Co-authored-by: git --- src/components/Tree/src/typing.ts | 1 + src/components/Tree/src/useTree.ts | 37 +++++++++++++++++++++++++++++- src/utils/helper/treeHelper.ts | 5 +++- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/src/components/Tree/src/typing.ts b/src/components/Tree/src/typing.ts index a847e6f4..3b699421 100644 --- a/src/components/Tree/src/typing.ts +++ b/src/components/Tree/src/typing.ts @@ -31,6 +31,7 @@ export interface TreeActionType { getCheckedKeys: () => CheckKeys; filterByLevel: (level: number) => void; insertNodeByKey: (opt: InsertNodeParams) => void; + insertNodesByKey: (opt: InsertNodeParams) => void; deleteNodeByKey: (key: string) => void; updateNodeByKey: (key: string, node: Omit) => void; } diff --git a/src/components/Tree/src/useTree.ts b/src/components/Tree/src/useTree.ts index 69c20d13..d39d5f72 100644 --- a/src/components/Tree/src/useTree.ts +++ b/src/components/Tree/src/useTree.ts @@ -87,11 +87,39 @@ export function useTree( if (treeItem[keyField] === parentKey) { treeItem[childrenField] = treeItem[childrenField] || []; treeItem[childrenField][push](node); + return true; } }); treeDataRef.value = treeData; } + /** + * 批量添加节点 + */ + function insertNodesByKey({ parentKey = null, list, push = 'push' }: InsertNodeParams) { + const treeData: any = cloneDeep(unref(treeDataRef)); + if (!list || list.length < 1) { + return; + } + if (!parentKey) { + for (let i = 0; i < list.length; i++) { + treeData[push](list[i]); + } + } else { + const { key: keyField, children: childrenField } = unref(getReplaceFields); + if (!childrenField || !keyField) return; + forEach(treeData, (treeItem) => { + if (treeItem[keyField] === parentKey) { + treeItem[childrenField] = treeItem[childrenField] || []; + for (let i = 0; i < list.length; i++) { + treeItem[childrenField][push](list[i]); + } + treeDataRef.value = treeData; + return true; + } + }); + } + } // Delete node function deleteNodeByKey(key: string, list?: TreeDataItem[]) { if (!key) return; @@ -111,5 +139,12 @@ export function useTree( } } } - return { deleteNodeByKey, insertNodeByKey, filterByLevel, updateNodeByKey, getAllKeys }; + return { + deleteNodeByKey, + insertNodeByKey, + insertNodesByKey, + filterByLevel, + updateNodeByKey, + getAllKeys, + }; } diff --git a/src/utils/helper/treeHelper.ts b/src/utils/helper/treeHelper.ts index 32530f79..f77faff5 100644 --- a/src/utils/helper/treeHelper.ts +++ b/src/utils/helper/treeHelper.ts @@ -147,7 +147,10 @@ export function forEach( const list: any[] = [...tree]; const { children } = config; for (let i = 0; i < list.length; i++) { - func(list[i]); + //func 返回true就终止遍历,避免大量节点场景下无意义循环,引起浏览器卡顿 + if (func(list[i])) { + return; + } children && list[i][children] && list.splice(i + 1, 0, ...list[i][children]); } } -- GitLab