From 6f67a57301e5deaf90c4edbba9dc8184328c2a56 Mon Sep 17 00:00:00 2001 From: LuckyFBB <976060700@qq.com> Date: Mon, 13 Oct 2025 17:23:46 +0800 Subject: [PATCH 1/2] feat(catalogue): add updateNodeByKey and remove updateTreeNodeEdit --- src/catalogue/utils.tsx | 50 ++++++++++++++++++++++++----------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/src/catalogue/utils.tsx b/src/catalogue/utils.tsx index 4588b8fa9..096ed397d 100644 --- a/src/catalogue/utils.tsx +++ b/src/catalogue/utils.tsx @@ -54,26 +54,6 @@ export const findNodeByKey = ( return null; }; -/** - * @description 更新 key 对应节点为编辑状态 - * @param {ITreeNode[]} data - 遍历的数组 - * @param {ITreeNode['key']} key - 当前 key 值 - * @returns {ITreeNode[]} 更新之后 data - */ -export const updateTreeNodeEdit = ( - data: ITreeNode[], - key: ITreeNode['key'] -): ITreeNode[] => - data.map((node) => { - if (node.key === key) { - return { ...node, edit: true }; - } - if (node.children) { - return { ...node, children: updateTreeNodeEdit(node.children, key) }; - } - return node; - }); - /** * @description 查找 key 对应的父级节点 * @param {ITreeNode[]} data - 遍历的数组 @@ -213,3 +193,33 @@ export const insertNodeAtKey = ( } return newTreeData; }; + +/** + * @description 根据 key 更新树中某个节点的内容。支持传入部分属性进行合并,或传入 updater 函数返回更新后的节点。 + * @param {ITreeNode[]} treeData - 要操作的树节点数组 + * @param {ITreeNode['key']} key - 目标节点的 key + * @param {Partial> | ((node: ITreeNode) => ITreeNode)} updater - 部分属性或 updater 函数 + * @returns {ITreeNode[]} 更新后的树节点数组 + */ +export const updateNodeByKey = ( + treeData: ITreeNode[], + key: ITreeNode['key'], + updater: Partial> | ((node: ITreeNode) => ITreeNode) +): ITreeNode[] => + treeData.map((node) => { + if (node.key === key) { + const updatedNode = + typeof updater === 'function' + ? (updater as (n: ITreeNode) => ITreeNode)(node) + : { ...node, ...(updater as Partial>) }; + // 保证在未显式更新 children 时保留原 children + if (node.children && updatedNode.children === undefined) { + return { ...updatedNode, children: node.children }; + } + return updatedNode; + } + if (node.children) { + return { ...node, children: updateNodeByKey(node.children, key, updater) }; + } + return node; + }); From 47ae134dbe31a54d9842cccef40b6c9bab14676f Mon Sep 17 00:00:00 2001 From: LuckyFBB <976060700@qq.com> Date: Mon, 13 Oct 2025 17:38:45 +0800 Subject: [PATCH 2/2] docs(catalogue): change utils method --- src/catalogue/demos/config.tsx | 4 ++-- src/catalogue/demos/drag.tsx | 4 ++-- src/catalogue/demos/operator.tsx | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/catalogue/demos/config.tsx b/src/catalogue/demos/config.tsx index 38047945d..99e2b707f 100644 --- a/src/catalogue/demos/config.tsx +++ b/src/catalogue/demos/config.tsx @@ -13,7 +13,7 @@ import { insertChildrenToNode, removeEditNode, removeNodeByKey, - updateTreeNodeEdit, + updateNodeByKey, } from '../utils'; const DEFAULT_DATA: ITreeNode[] = [ @@ -77,7 +77,7 @@ export default () => { const treeData = useTreeData(); const handleEdit = (key: ITreeNode['key']) => { - const data = updateTreeNodeEdit(treeData.data, key); + const data = updateNodeByKey(treeData.data, key, { edit: true }); treeData.onChange(data); }; diff --git a/src/catalogue/demos/drag.tsx b/src/catalogue/demos/drag.tsx index 7a561b888..82d83dec5 100644 --- a/src/catalogue/demos/drag.tsx +++ b/src/catalogue/demos/drag.tsx @@ -13,7 +13,7 @@ import { insertChildrenToNode, removeEditNode, removeNodeByKey, - updateTreeNodeEdit, + updateNodeByKey, } from '../utils'; interface IData { @@ -71,7 +71,7 @@ export default () => { const treeData = useTreeData(); const handleEdit = (key: ITreeNode['key']) => { - const data = updateTreeNodeEdit(treeData.data, key); + const data = updateNodeByKey(treeData.data, key, { edit: true }); treeData.onChange(data); }; diff --git a/src/catalogue/demos/operator.tsx b/src/catalogue/demos/operator.tsx index de692182a..c753ffdbb 100644 --- a/src/catalogue/demos/operator.tsx +++ b/src/catalogue/demos/operator.tsx @@ -12,7 +12,7 @@ import { insertChildrenToNode, removeEditNode, removeNodeByKey, - updateTreeNodeEdit, + updateNodeByKey, } from '../utils'; const DEFAULT_DATA = [ @@ -124,7 +124,7 @@ export default () => { const treeData = useTreeData(); const handleEdit = (key: ITreeNode['key']) => { - const data = updateTreeNodeEdit(treeData.data, key); + const data = updateNodeByKey(treeData.data, key, { edit: true }); treeData.onChange(data); };