From 7d76f3d2f8624850efc300b1f7cff69b7cfef3db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Leo=20Caan=20=28=E9=99=88=E6=A0=8B=29?= Date: Wed, 28 Jan 2026 15:17:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=AE=BE=E7=BD=AEdefa?= =?UTF-8?q?ult-expanded-level=E5=90=8E=E6=97=A0=E6=B3=95check=E6=9B=B4?= =?UTF-8?q?=E4=BD=8E=E5=B1=82=E7=BA=A7=E8=8A=82=E7=82=B9=20logic=20and=20t?= =?UTF-8?q?ree=20value=20updates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 假设缺省展开2级,当check 3级节点时,会触发effectWatch重新收缩到2级,并丢失check操作check操作andling. --- .../ui-kit/shadcn-ui/src/ui/tree/tree.vue | 40 ++++++++++++------- 1 file changed, 25 insertions(+), 15 deletions(-) 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; } } }