diff --git a/packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue b/packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue index c2c7607f7..e664878cd 100644 --- a/packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue +++ b/packages/@core/ui-kit/shadcn-ui/src/ui/tree/tree.vue @@ -65,16 +65,24 @@ const modelValue = defineModel>(); const expanded = ref>(props.defaultExpandedKeys ?? []); const treeValue = ref(); +let lastTreeData: any = null; onMounted(() => { watchEffect(() => { flattenData.value = flatten(props.treeData, props.childrenField); updateTreeValue(); - if ( - props.defaultExpandedLevel !== undefined && - props.defaultExpandedLevel > 0 - ) - expandToLevel(props.defaultExpandedLevel); + + // 只在 treeData 变化时执行展开 + const currentTreeData = JSON.stringify(props.treeData); + if (lastTreeData !== currentTreeData) { + lastTreeData = currentTreeData; + if ( + props.defaultExpandedLevel !== undefined && + props.defaultExpandedLevel > 0 + ) { + expandToLevel(props.defaultExpandedLevel); + } + } }); }); @@ -87,9 +95,11 @@ function getItemByValue(value: number | string) { function updateTreeValue() { const val = modelValue.value; if (val === undefined) { - treeValue.value = undefined; - } else { - if (Array.isArray(val)) { + treeValue.value = props.multiple ? [] : undefined; + } else if (Array.isArray(val)) { + if (val.length === 0) { + treeValue.value = []; + } else { const filteredValues = val.filter((v) => { const item = getItemByValue(v); return item && !get(item, props.disabledField); @@ -99,14 +109,14 @@ function updateTreeValue() { if (filteredValues.length !== val.length) { modelValue.value = filteredValues; } + } + } else { + const item = getItemByValue(val); + if (item && !get(item, props.disabledField)) { + treeValue.value = item; } else { - const item = getItemByValue(val); - if (item && !get(item, props.disabledField)) { - treeValue.value = item; - } else { - treeValue.value = undefined; - modelValue.value = undefined; - } + treeValue.value = props.multiple ? [] : undefined; + modelValue.value = props.multiple ? [] : undefined; } } }