From ccb9f09452af600b660cb25f439e03130a913b2e Mon Sep 17 00:00:00 2001 From: Syngnat Date: Fri, 20 Mar 2026 12:59:24 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=90=9B=20fix(store):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E4=BF=9D=E5=AD=98=E6=9F=A5=E8=AF=A2=E5=90=8E=E5=86=8D=E6=AC=A1?= =?UTF-8?q?=E6=89=93=E5=BC=80=E4=BA=A7=E7=94=9F=E9=87=8D=E5=A4=8DTab?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增语义去重:addTab对query类型按savedQueryId匹配已有Tab - 匹配条件覆盖savedQueryId相同或Tab id等于savedQueryId两种场景 - 命中已有Tab时复用并激活,避免重复创建 - refs #280 --- frontend/src/store.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/frontend/src/store.ts b/frontend/src/store.ts index 0833ae2..e081769 100644 --- a/frontend/src/store.ts +++ b/frontend/src/store.ts @@ -736,6 +736,18 @@ export const useStore = create()( return { tabs: newTabs, activeTabId: existingTab.id }; } } + // 语义去重:对 query 类型按 savedQueryId 匹配已有 Tab(避免保存后重复打开) + if (tab.type === 'query' && tab.savedQueryId) { + const savedQueryIndex = state.tabs.findIndex(t => + t.type === 'query' && (t.savedQueryId === tab.savedQueryId || t.id === tab.savedQueryId) + ); + if (savedQueryIndex !== -1) { + const existingTab = state.tabs[savedQueryIndex]; + const newTabs = [...state.tabs]; + newTabs[savedQueryIndex] = { ...existingTab, ...tab, id: existingTab.id }; + return { tabs: newTabs, activeTabId: existingTab.id }; + } + } return { tabs: [...state.tabs, tab], activeTabId: tab.id }; }),