Skip to content

Commit a7863a3

Browse files
committed
fix: 复选框选中状态
1 parent 1f1438f commit a7863a3

File tree

2 files changed

+52
-13
lines changed

2 files changed

+52
-13
lines changed

packages/vue-virtual-tree/src/composables/useTreeData.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,22 @@ export function useTreeData(props: VirtualTreeProps) {
103103
updateFlatTree()
104104
}, { deep: true })
105105

106+
// 监听 defaultExpandedKeys 和 defaultExpandAll 变化
107+
watch(
108+
() => [props.defaultExpandedKeys, props.defaultExpandAll, props.data],
109+
() => {
110+
if (props.defaultExpandAll) {
111+
// 获取所有节点的 key
112+
const allKeys = getAllKeys(props.data, props.props)
113+
expandedKeys.value = new Set(allKeys)
114+
} else if (props.defaultExpandedKeys && props.defaultExpandedKeys.length > 0) {
115+
expandedKeys.value = new Set(props.defaultExpandedKeys)
116+
}
117+
updateFlatTree()
118+
},
119+
{ deep: true, immediate: false }
120+
)
121+
106122
// 可见节点(用于虚拟滚动)
107123
const visibleNodes = computed(() => {
108124
return flatTree.value.filter(node => node.isVisible)

packages/vue-virtual-tree/src/composables/useTreeSelection.ts

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
import { ref, computed, watch } from 'vue'
1+
import { ref, watch, nextTick } from 'vue'
22
import type { Ref } from 'vue'
33
import type { VirtualTreeProps, FlatTreeNode, TreeNodeData } from '../types'
4-
import { getNodeId, getNodeChildren, traverseTree, isLeafNode } from '../utils/tree'
4+
import { getNodeId, getNodeChildren, isLeafNode } from '../utils/tree'
55

66
/**
77
* 树节点选择逻辑
@@ -39,24 +39,24 @@ export function useTreeSelection(
3939
}
4040
}
4141

42-
// 获取节点的所有子节点 key(只获取已展开的可见子节点
42+
// 获取节点的所有子节点 key(从原始数据递归获取,包括未展开的子节点
4343
const getAllChildrenKeys = (nodeId: string | number): (string | number)[] => {
4444
const keys: (string | number)[] = []
45-
const node = flatTree.value.find(n => n.id === nodeId)
46-
if (!node) return keys
45+
const nodeData = getNodeData(nodeId)
46+
if (!nodeData) return keys
4747

48-
const traverse = (id: string | number) => {
49-
const children = flatTree.value.filter(n => n.parentId === id && n.isVisible)
48+
// 从原始数据递归获取所有子节点
49+
const traverse = (data: TreeNodeData) => {
50+
const children = getNodeChildren(data, props.props)
5051
children.forEach(child => {
51-
keys.push(child.id)
52-
// 只有当子节点展开时才递归获取其子节点
53-
if (child.isExpanded) {
54-
traverse(child.id)
55-
}
52+
const childId = getNodeId(child, props.props)
53+
keys.push(childId)
54+
// 递归获取子节点的子节点
55+
traverse(child)
5656
})
5757
}
5858

59-
traverse(nodeId)
59+
traverse(nodeData)
6060
return keys
6161
}
6262

@@ -228,6 +228,29 @@ export function useTreeSelection(
228228
initCheckedKeys()
229229
initCurrentNode()
230230

231+
// 监听 defaultCheckedKeys 和原始数据变化
232+
watch(
233+
() => [props.defaultCheckedKeys, props.data],
234+
() => {
235+
if (props.defaultCheckedKeys && props.defaultCheckedKeys.length > 0) {
236+
checkedKeys.value = new Set(props.defaultCheckedKeys)
237+
// 等待 flatTree 更新后再计算半选状态
238+
if (!props.checkStrictly) {
239+
// 使用 nextTick 确保 flatTree 已经更新
240+
nextTick(() => {
241+
if (flatTree.value.length > 0) {
242+
updateHalfCheckedKeys()
243+
}
244+
})
245+
}
246+
} else if (props.defaultCheckedKeys && props.defaultCheckedKeys.length === 0) {
247+
checkedKeys.value.clear()
248+
halfCheckedKeys.value.clear()
249+
}
250+
},
251+
{ deep: true, immediate: false }
252+
)
253+
231254
// 监听 props.currentNodeKey 变化
232255
watch(
233256
() => props.currentNodeKey,

0 commit comments

Comments
 (0)