From e92e49f04f0d28985b594197a56b27a96811c3de Mon Sep 17 00:00:00 2001 From: ShiGuangAlex Date: Sat, 11 Apr 2026 17:06:33 +0800 Subject: [PATCH] Fix search card virtualization and result count --- src/app/search/page.tsx | 113 ++++++---- src/components/VirtualScrollableGrid.tsx | 263 +++++++++++++++++------ 2 files changed, 273 insertions(+), 103 deletions(-) diff --git a/src/app/search/page.tsx b/src/app/search/page.tsx index 2118fbb..7687cfb 100644 --- a/src/app/search/page.tsx +++ b/src/app/search/page.tsx @@ -355,19 +355,21 @@ function SearchPageClient() { return normalizedTitle.includes(normalizedQuery); }; + + const allExactSearchResults = useMemo(() => { + if (!exactSearch) return searchResults; + + return searchResults.filter((item) => + titleContainsQuery(item.title, currentQueryRef.current) + ); + }, [searchResults, searchQuery, exactSearch]); + // 聚合后的结果(按标题和年份分组) const aggregatedResults = useMemo(() => { - // 首先应用精确搜索过滤 - const filteredResults = exactSearch - ? searchResults.filter((item) => - titleContainsQuery(item.title, currentQueryRef.current) - ) - : searchResults; - //===== 阶段1:按 normalizedTitle-type 初步分组 ===== const preliminaryMap = new Map(); - filteredResults.forEach((item) => { + allExactSearchResults.forEach((item) => { const normalizedTitle = normalizeTitle(item.title); const type = getType(item); const preliminaryKey = `${normalizedTitle}-${type}`; @@ -428,7 +430,7 @@ function SearchPageClient() { return keyOrder.map( (key) => [key, finalMap.get(key)!] as [string, SearchResult[]] ); - }, [searchResults, exactSearch]); + }, [allExactSearchResults]); // 当聚合结果变化时,如果某个聚合已存在,则调用其卡片 ref 的 set 方法增量更新 useEffect(() => { @@ -641,14 +643,7 @@ function SearchPageClient() { const filteredAllResults = useMemo(() => { const { source, title, year, yearOrder } = filterAll; - // 首先应用精确搜索过滤 - const exactSearchFiltered = exactSearch - ? searchResults.filter((item) => - titleContainsQuery(item.title, currentQueryRef.current) - ) - : searchResults; - - const filtered = exactSearchFiltered.filter((item) => { + const filtered = allExactSearchResults.filter((item) => { if (source !== 'all' && item.source !== source) return false; if (title !== 'all' && item.title !== title) return false; if (year !== 'all' && item.year !== year) return false; @@ -677,7 +672,7 @@ function SearchPageClient() { ? a.title.localeCompare(b.title) : b.title.localeCompare(a.title); }); - }, [searchResults, filterAll, searchQuery, exactSearch]); + }, [allExactSearchResults, filterAll, searchQuery]); // 聚合:应用筛选与排序 const filteredAggResults = useMemo(() => { @@ -734,6 +729,30 @@ function SearchPageClient() { filteredAllResults.length, ]); + const resultCountMeta = useMemo(() => { + const isAggregateView = viewMode === 'agg'; + const visibleCount = isAggregateView + ? filteredAggResults.length + : filteredAllResults.length; + const totalCount = isAggregateView + ? aggregatedResults.length + : allExactSearchResults.length; + + return { + visibleCount, + totalCount, + isFiltered: visibleCount !== totalCount, + modeLabel: isAggregateView ? '聚合结果' : '搜索结果', + unit: isAggregateView ? '组' : '条', + }; + }, [ + viewMode, + filteredAggResults.length, + filteredAllResults.length, + aggregatedResults.length, + allExactSearchResults.length, + ]); + useEffect(() => { if (typeof window !== 'undefined') { localStorage.setItem('searchResultDisplayMode', resultDisplayMode); @@ -1570,28 +1589,44 @@ function SearchPageClient() { <> {/* 影视搜索结果 */} {/* 标题 */} -
-

- 搜索结果 - {isFromCache ? ( - - 缓存 +
+
+

+ 搜索结果 + {isFromCache ? ( + + 缓存 + + ) : ( + <> + {totalSources > 0 && useFluidSearch && ( + + 源 {completedSources}/{totalSources} + + )} + {isLoading && useFluidSearch && ( + + + + )} + + )} +

+
+ + {resultCountMeta.modeLabel}{' '} + {resultCountMeta.visibleCount.toLocaleString()}{' '} + {resultCountMeta.unit} - ) : ( - <> - {totalSources > 0 && useFluidSearch && ( - - {completedSources}/{totalSources} - - )} - {isLoading && useFluidSearch && ( - - - - )} - - )} -

+ {resultCountMeta.isFiltered && ( + + 筛选前{' '} + {resultCountMeta.totalCount.toLocaleString()}{' '} + {resultCountMeta.unit} + + )} +
+ {searchQuery && (