Skip to content

Commit d12b15b

Browse files
committed
feat: add update node APIs
1 parent 549e4fd commit d12b15b

File tree

4 files changed

+72
-0
lines changed

4 files changed

+72
-0
lines changed

src/components/Tree.vue

+4
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,8 @@ const {
405405
filter,
406406
showCheckedNodes,
407407
loadRootNodes,
408+
updateNode,
409+
updateNodes,
408410
} = usePublicTreeAPI(nonReactive, props, {
409411
resetSpaceHeights,
410412
updateExpandedKeys,
@@ -705,6 +707,8 @@ defineExpose({
705707
filter,
706708
showCheckedNodes,
707709
loadRootNodes,
710+
updateNode,
711+
updateNodes,
708712
scrollTo,
709713
})
710714

src/constants/index.ts

+2
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ export const TREE_API_METHODS = [
3939
'filter',
4040
'showCheckedNodes',
4141
'loadRootNodes',
42+
'updateNode',
43+
'updateNodes',
4244
'scrollTo'
4345
] as const
4446

src/hooks/usePublicTreeAPI.ts

+14
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,18 @@ export const usePublicTreeAPI = (
235235
isRootLoading.value = false
236236
})
237237
}
238+
/**
239+
* 更新单个节点
240+
*/
241+
function updateNode(key: TreeNodeKeyType, newNode: ITreeNodeOptions) {
242+
return nonReactive.store.updateNode(key, newNode)
243+
}
244+
/**
245+
* 更新多个节点
246+
*/
247+
function updateNodes(newNodes: ITreeNodeOptions[]) {
248+
return nonReactive.store.updateNodes(newNodes)
249+
}
238250

239251
return {
240252
unloadCheckedNodes,
@@ -269,5 +281,7 @@ export const usePublicTreeAPI = (
269281
filter,
270282
showCheckedNodes,
271283
loadRootNodes,
284+
updateNode,
285+
updateNodes,
272286
}
273287
}

src/store/tree-store.ts

+52
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,58 @@ export default class TreeStore extends TreeEventTarget {
518518
}
519519
}
520520

521+
updateNode(key: TreeNodeKeyType, newNode: ITreeNodeOptions, triggerDataChange = true) {
522+
if (!this.mapData[key]) return
523+
524+
const newNodeCopy: ITreeNodeOptions = {}
525+
const notAllowedFields = [
526+
this.options.keyField,
527+
'indeterminate',
528+
'visible',
529+
'isLeaf',
530+
]
531+
532+
// Exclude key field and fields starting with '_'
533+
Object.keys(newNode).forEach((field) => {
534+
if (!field.startsWith('_') && !notAllowedFields.includes(field)) {
535+
newNodeCopy[field] = newNode[field]
536+
}
537+
})
538+
539+
if (Array.isArray(newNodeCopy.children)) {
540+
this.mapData[key].setChildren(newNodeCopy.children)
541+
delete newNodeCopy.children
542+
}
543+
if ('checked' in newNodeCopy) {
544+
this.setChecked(key, newNodeCopy.checked, false, false)
545+
delete newNodeCopy.checked
546+
}
547+
if ('selected' in newNodeCopy) {
548+
this.setSelected(key, newNodeCopy.selected, false, false)
549+
delete newNodeCopy.selected
550+
}
551+
if ('expand' in newNodeCopy) {
552+
this.setExpand(key, newNodeCopy.expand, false, false, false)
553+
delete newNodeCopy.expand
554+
}
555+
Object.keys(newNodeCopy).forEach((field) => {
556+
this.mapData[key][field] = newNodeCopy[field]
557+
})
558+
559+
if (triggerDataChange) {
560+
this.emit('visible-data-change')
561+
}
562+
}
563+
564+
updateNodes(newNodes: ITreeNodeOptions[]) {
565+
const validNodes = newNodes.filter((node) => node[this.options.keyField] != null)
566+
validNodes.forEach((node) => {
567+
this.updateNode(node[this.options.keyField], node, false)
568+
})
569+
570+
this.emit('visible-data-change')
571+
}
572+
521573
//#endregion Set api
522574

523575
//#region Get api

0 commit comments

Comments
 (0)