@@ -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