From a900d6cc6169c9cbea5b05f26e5bf173e32d2e00 Mon Sep 17 00:00:00 2001 From: JOJO <1498581755@qq.com> Date: Thu, 23 Jul 2026 21:55:14 +0800 Subject: [PATCH] =?UTF-8?q?fix(sidebar):=20=E4=BF=AE=E5=A4=8D=E5=88=A0?= =?UTF-8?q?=E9=99=A4=E5=B7=A5=E4=BD=9C=E5=8C=BA=E4=B8=8D=E7=94=9F=E6=95=88?= =?UTF-8?q?=E4=B8=8E=E6=8E=A7=E5=88=B6=E5=8F=B0=20TDZ=20=E6=8A=A5=E9=94=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ConversationSidebar: immediate watcher 在 setup 阶段同步执行,却引用了 之后才声明的 isGroupByWorkspaceActive,触发 TDZ ReferenceError; 调整声明顺序并加注释防回退 - WorkspaceSwitcher: onDocClick 为捕获阶段监听,未排除 teleport 到 body 的二级菜单,点击菜单项(删除/重命名)会先关闭整个浮层,导致内联 确认框永远不可见、删除流程无法走完;补充 .ws-menu-floating 排除 - WorkspaceSwitcher: 删除确认按钮区靠右对齐 --- static/src/components/sidebar/ConversationSidebar.vue | 10 ++++++---- static/src/components/sidebar/WorkspaceSwitcher.vue | 5 +++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/static/src/components/sidebar/ConversationSidebar.vue b/static/src/components/sidebar/ConversationSidebar.vue index 644ec941..a2c04dea 100644 --- a/static/src/components/sidebar/ConversationSidebar.vue +++ b/static/src/components/sidebar/ConversationSidebar.vue @@ -994,6 +994,12 @@ watch( { immediate: true, deep: true } ); +const isGroupByWorkspaceActive = computed( + () => props.groupByWorkspace && props.hostWorkspaceEnabled && Array.isArray(props.workspaces) && props.workspaces.length > 0 +); + +/* 注意:本 watcher 声明必须放在 isGroupByWorkspaceActive 之后—— + immediate 回调会在 setup 阶段同步执行,提前引用会触发 TDZ 报错。 */ watch( () => props.currentWorkspaceId, async () => { @@ -1011,10 +1017,6 @@ watch( }, { immediate: true } ); - -const isGroupByWorkspaceActive = computed( - () => props.groupByWorkspace && props.hostWorkspaceEnabled && Array.isArray(props.workspaces) && props.workspaces.length > 0 -); const sortedWorkspaces = computed(() => { const list = Array.isArray(props.workspaces) ? [...props.workspaces] : []; return list.sort((a: any, b: any) => { diff --git a/static/src/components/sidebar/WorkspaceSwitcher.vue b/static/src/components/sidebar/WorkspaceSwitcher.vue index 63af8573..afd668de 100644 --- a/static/src/components/sidebar/WorkspaceSwitcher.vue +++ b/static/src/components/sidebar/WorkspaceSwitcher.vue @@ -400,6 +400,10 @@ watch( const onDocClick = (event: MouseEvent) => { const target = event.target as Node | null; if (!target) return; + /* 二级菜单 teleport 到 body、与 popoverEl 是兄弟节点;capture 阶段会先于此处 + 触发,若不排除会导致点击菜单项(删除/重命名)时整个浮层先被关闭, + 菜单动作设置的内联状态(deletingId/renamingId)永远不可见。 */ + if ((target as Element).closest?.('.ws-menu-floating')) return; if (popoverEl.value && !popoverEl.value.contains(target)) { /* 点击入口按钮:交给按钮自身的 toggle 处理(已展开则收起), 避免 capture 阶段先 close、按钮 click 又重新打开导致重播动画 */ @@ -698,6 +702,7 @@ onBeforeUnmount(() => { .ws-confirm-actions { display: flex; + justify-content: flex-end; gap: 8px; }