Skip to content

Commit 6f67a57

Browse files
committed
feat(catalogue): add updateNodeByKey and remove updateTreeNodeEdit
1 parent f1b67e4 commit 6f67a57

File tree

1 file changed

+30
-20
lines changed

1 file changed

+30
-20
lines changed

src/catalogue/utils.tsx

Lines changed: 30 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -54,26 +54,6 @@ export const findNodeByKey = <U,>(
5454
return null;
5555
};
5656

57-
/**
58-
* @description 更新 key 对应节点为编辑状态
59-
* @param {ITreeNode<U>[]} data - 遍历的数组
60-
* @param {ITreeNode<U>['key']} key - 当前 key 值
61-
* @returns {ITreeNode<U>[]} 更新之后 data
62-
*/
63-
export const updateTreeNodeEdit = <U,>(
64-
data: ITreeNode<U>[],
65-
key: ITreeNode<U>['key']
66-
): ITreeNode<U>[] =>
67-
data.map((node) => {
68-
if (node.key === key) {
69-
return { ...node, edit: true };
70-
}
71-
if (node.children) {
72-
return { ...node, children: updateTreeNodeEdit(node.children, key) };
73-
}
74-
return node;
75-
});
76-
7757
/**
7858
* @description 查找 key 对应的父级节点
7959
* @param {ITreeNode<U>[]} data - 遍历的数组
@@ -213,3 +193,33 @@ export const insertNodeAtKey = <U extends { edit?: boolean }>(
213193
}
214194
return newTreeData;
215195
};
196+
197+
/**
198+
* @description 根据 key 更新树中某个节点的内容。支持传入部分属性进行合并,或传入 updater 函数返回更新后的节点。
199+
* @param {ITreeNode<U>[]} treeData - 要操作的树节点数组
200+
* @param {ITreeNode<U>['key']} key - 目标节点的 key
201+
* @param {Partial<ITreeNode<U>> | ((node: ITreeNode<U>) => ITreeNode<U>)} updater - 部分属性或 updater 函数
202+
* @returns {ITreeNode<U>[]} 更新后的树节点数组
203+
*/
204+
export const updateNodeByKey = <U extends { edit?: boolean }>(
205+
treeData: ITreeNode<U>[],
206+
key: ITreeNode<U>['key'],
207+
updater: Partial<ITreeNode<U>> | ((node: ITreeNode<U>) => ITreeNode<U>)
208+
): ITreeNode<U>[] =>
209+
treeData.map((node) => {
210+
if (node.key === key) {
211+
const updatedNode =
212+
typeof updater === 'function'
213+
? (updater as (n: ITreeNode<U>) => ITreeNode<U>)(node)
214+
: { ...node, ...(updater as Partial<ITreeNode<U>>) };
215+
// 保证在未显式更新 children 时保留原 children
216+
if (node.children && updatedNode.children === undefined) {
217+
return { ...updatedNode, children: node.children };
218+
}
219+
return updatedNode;
220+
}
221+
if (node.children) {
222+
return { ...node, children: updateNodeByKey(node.children, key, updater) };
223+
}
224+
return node;
225+
});

0 commit comments

Comments
 (0)