diff --git a/packages/components/tree/src/model/node.ts b/packages/components/tree/src/model/node.ts index b3d5e1fa2c..4aa4f4ad65 100644 --- a/packages/components/tree/src/model/node.ts +++ b/packages/components/tree/src/model/node.ts @@ -558,6 +558,20 @@ class Node { } } } + + eachNode(callback: (node: Node) => void) { + const arr: Node[] = [this] + while (arr.length) { + const node = arr.shift()! + arr.unshift(...node.childNodes) + callback(node) + } + } + + reInitChecked() { + if (this.store.checkStrictly) return + reInitChecked(this) + } } export default Node diff --git a/packages/components/tree/src/model/useDragNode.ts b/packages/components/tree/src/model/useDragNode.ts index 79091a5de9..d45f98b58b 100644 --- a/packages/components/tree/src/model/useDragNode.ts +++ b/packages/components/tree/src/model/useDragNode.ts @@ -180,6 +180,15 @@ export function useDragNodeHandler({ props, ctx, el$, dropIndicator$, store }) { } if (dropType !== 'none') { store.value.registerNode(draggingNodeCopy) + if (store.value.key) { + //restore checkbox state after dragging + draggingNode.node.eachNode((node) => { + store.value.nodesMap[node.data[store.value.key]]?.setChecked( + node.checked, + !store.value.checkStrictly + ) + }) + } } removeClass(dropNode.$el, ns.is('drop-inner')) diff --git a/packages/components/tree/src/tree-node.vue b/packages/components/tree/src/tree-node.vue index bb96a19978..5c0bd645e4 100644 --- a/packages/components/tree/src/tree-node.vue +++ b/packages/components/tree/src/tree-node.vue @@ -183,6 +183,11 @@ export default defineComponent({ } ) + watch( + () => props.node.childNodes.length, + () => props.node.reInitChecked() + ) + watch( () => props.node.expanded, (val) => {