From ec95d717326a78d9b81461cb123388343b29ff1d Mon Sep 17 00:00:00 2001 From: richard Date: Thu, 27 Aug 2026 10:08:08 +0800 Subject: [PATCH] fix(dialog): dedup nav list so stock preview skips duplicate symbols MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 同一标的在榜单中多次出现(多概念/行业 leader、监控重复触发)时, 去重后保留首次出现, 避免切股与 n/N 计数空跳。 Co-Authored-By: Claude --- frontend/src/components/StockPreviewDialog.tsx | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/frontend/src/components/StockPreviewDialog.tsx b/frontend/src/components/StockPreviewDialog.tsx index 42f5501..352a9bc 100644 --- a/frontend/src/components/StockPreviewDialog.tsx +++ b/frontend/src/components/StockPreviewDialog.tsx @@ -51,6 +51,18 @@ function wrapNavIndex(navIdx: number, delta: number, navTotal: number): number { return (navIdx + delta + navTotal) % navTotal } +/** 榜单里同一标的可能多次出现 (多概念/行业 leader、监控重复触发), 去重以免切股/计数空跳; 保留首次出现。 */ +function uniqueNavItems(xs: NavItem[]): NavItem[] { + const seen = new Set() + const out: NavItem[] = [] + for (const n of xs) { + if (seen.has(n.symbol)) continue + seen.add(n.symbol) + out.push(n) + } + return out +} + // ===== 板块标识(与 Screener 列表一致)===== // 预设快捷范围(只保留半年和1年) @@ -155,7 +167,7 @@ export function StockPreviewDialog({ symbol, name, onClose, triggerInfo, navList }) // ===== 切股导航 ===== - const navList = useMemo(() => navListSource ?? [], [navListSource]) + const navList = useMemo(() => uniqueNavItems(navListSource ?? []), [navListSource]) // 当前 symbol 在 navList 中的位置 (不在列表则为 -1, 此时不显示计数/按钮) const navIdx = navList.findIndex(n => n.symbol === symbol)