|
1 | | -import { ref, computed, watch } from 'vue' |
| 1 | +import { ref, watch, nextTick } from 'vue' |
2 | 2 | import type { Ref } from 'vue' |
3 | 3 | import type { VirtualTreeProps, FlatTreeNode, TreeNodeData } from '../types' |
4 | | -import { getNodeId, getNodeChildren, traverseTree, isLeafNode } from '../utils/tree' |
| 4 | +import { getNodeId, getNodeChildren, isLeafNode } from '../utils/tree' |
5 | 5 |
|
6 | 6 | /** |
7 | 7 | * 树节点选择逻辑 |
@@ -39,24 +39,24 @@ export function useTreeSelection( |
39 | 39 | } |
40 | 40 | } |
41 | 41 |
|
42 | | - // 获取节点的所有子节点 key(只获取已展开的可见子节点) |
| 42 | + // 获取节点的所有子节点 key(从原始数据递归获取,包括未展开的子节点) |
43 | 43 | const getAllChildrenKeys = (nodeId: string | number): (string | number)[] => { |
44 | 44 | 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 |
47 | 47 |
|
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) |
50 | 51 | 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) |
56 | 56 | }) |
57 | 57 | } |
58 | 58 |
|
59 | | - traverse(nodeId) |
| 59 | + traverse(nodeData) |
60 | 60 | return keys |
61 | 61 | } |
62 | 62 |
|
@@ -228,6 +228,29 @@ export function useTreeSelection( |
228 | 228 | initCheckedKeys() |
229 | 229 | initCurrentNode() |
230 | 230 |
|
| 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 | + |
231 | 254 | // 监听 props.currentNodeKey 变化 |
232 | 255 | watch( |
233 | 256 | () => props.currentNodeKey, |
|
0 commit comments