Skip to content

Commit 950c864

Browse files
authored
feat(catalogue): add updateNodeByKey and remove updateTreeNodeEdit (#611)
* feat(catalogue): add updateNodeByKey and remove updateTreeNodeEdit * docs(catalogue): change utils method
1 parent f1b67e4 commit 950c864

File tree

4 files changed

+36
-26
lines changed

4 files changed

+36
-26
lines changed

src/catalogue/demos/config.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
insertChildrenToNode,
1414
removeEditNode,
1515
removeNodeByKey,
16-
updateTreeNodeEdit,
16+
updateNodeByKey,
1717
} from '../utils';
1818

1919
const DEFAULT_DATA: ITreeNode<IData>[] = [
@@ -77,7 +77,7 @@ export default () => {
7777
const treeData = useTreeData<IData>();
7878

7979
const handleEdit = (key: ITreeNode<IData>['key']) => {
80-
const data = updateTreeNodeEdit<IData>(treeData.data, key);
80+
const data = updateNodeByKey<IData>(treeData.data, key, { edit: true });
8181
treeData.onChange(data);
8282
};
8383

src/catalogue/demos/drag.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
insertChildrenToNode,
1414
removeEditNode,
1515
removeNodeByKey,
16-
updateTreeNodeEdit,
16+
updateNodeByKey,
1717
} from '../utils';
1818

1919
interface IData {
@@ -71,7 +71,7 @@ export default () => {
7171
const treeData = useTreeData<IData>();
7272

7373
const handleEdit = (key: ITreeNode<IData>['key']) => {
74-
const data = updateTreeNodeEdit<IData>(treeData.data, key);
74+
const data = updateNodeByKey<IData>(treeData.data, key, { edit: true });
7575
treeData.onChange(data);
7676
};
7777

src/catalogue/demos/operator.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import {
1212
insertChildrenToNode,
1313
removeEditNode,
1414
removeNodeByKey,
15-
updateTreeNodeEdit,
15+
updateNodeByKey,
1616
} from '../utils';
1717

1818
const DEFAULT_DATA = [
@@ -124,7 +124,7 @@ export default () => {
124124
const treeData = useTreeData<IData>();
125125

126126
const handleEdit = (key: ITreeNode<IData>['key']) => {
127-
const data = updateTreeNodeEdit<IData>(treeData.data, key);
127+
const data = updateNodeByKey<IData>(treeData.data, key, { edit: true });
128128
treeData.onChange(data);
129129
};
130130

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)