Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 157f4d5

Browse files
feat: add update node APIs
1 parent f5fb500 commit 157f4d5

File tree

4 files changed

+72
-0
lines changed

4 files changed

+72
-0
lines changed

‎src/components/Tree.vue

Lines changed: 4 additions & 0 deletions
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

Lines changed: 2 additions & 0 deletions
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

Lines changed: 14 additions & 0 deletions
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

Lines changed: 52 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /