From 2ddd2940cc317ec6374130f3fccf0b244774835b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BB=9D=E5=B0=98?= <237809796@qq.com> Date: Mon, 15 Jun 2026 09:17:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D:=20CR-31=20useConfirm=20?= =?UTF-8?q?=E5=B9=B6=E5=8F=91=E8=A6=86=E7=9B=96=20resolve+ToolCardList=20?= =?UTF-8?q?=E5=AF=B9=E7=A7=B0=E6=B8=85=20expandedTools?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ①useConfirm confirmDialog 进入时先 resolve?.(false) 打断前一个(连点删除/confirm 交错时前一个 Promise 永挂,resolve 被覆盖静默中断+内存泄漏),视为取消;②ToolCardList collapseInactive 对称过滤 expandedTools(原只清 expandedCards,expandedTools 残留致已完成卡片折叠后内容展开态)。cron 巡检捕获走查第8轮 CR-31,vue-tsc 0 --- src/components/ToolCardList.vue | 4 ++++ src/composables/useConfirm.ts | 3 +++ 2 files changed, 7 insertions(+) diff --git a/src/components/ToolCardList.vue b/src/components/ToolCardList.vue index fdccf91..0e068dc 100644 --- a/src/components/ToolCardList.vue +++ b/src/components/ToolCardList.vue @@ -45,9 +45,13 @@ function toggleExpand(id: string) { /** 收起不在 activeIds 中的已完成/已拒绝卡片(供父组件 auto-collapse watch 调用) */ function collapseInactive(activeIds: Set): void { + // CR-260615-31:对称过滤 expandedTools(原只清 expandedCards,expandedTools 残留致折叠后内容展开态) if (expandedCards.value.size > 0) { expandedCards.value = new Set([...expandedCards.value].filter(id => activeIds.has(id))) } + if (expandedTools.value.size > 0) { + expandedTools.value = new Set([...expandedTools.value].filter(id => activeIds.has(id))) + } } defineExpose({ collapseInactive }) diff --git a/src/composables/useConfirm.ts b/src/composables/useConfirm.ts index 71ab34a..255a2e5 100644 --- a/src/composables/useConfirm.ts +++ b/src/composables/useConfirm.ts @@ -34,6 +34,9 @@ export function useConfirm() { function confirmDialog(msg: string): Promise { return new Promise(resolve => { + // CR-260615-31:并发覆盖前一个 confirmDialog(连点删除/confirm 交错)时, + // 前一个 Promise 永挂(resolve 被覆盖)→ 先 resolve?.(false) 打断前一个视为取消 + confirmState.value.resolve?.(false) confirmState.value.msg = msg confirmState.value.visible = true confirmState.value.resolve = resolve