From 516aeab8de79e6dd35d099b89d82b9f6407f09ac Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Fri, 7 Aug 2026 18:53:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20AI=20Code=20Review?= =?UTF-8?q?=20=E6=8F=90=E5=87=BA=E7=9A=843=E4=B8=AA=E9=98=BB=E5=A1=9E?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 模式切换失效:使用复合 triggerKey (libraryId_mode) 替代单一 libraryId 模式切换时 key 变化会重新触发自动匹配 2. 闭包陷阱:将 handleSmartMatch 从 smartMatch 解构并加入依赖项 handleSmartMatch 由 useCallback 包装,引用稳定 3. 依赖粒度:materials.items 替代 materials.items.length 素材内容变化也能正确触发重新匹配 --- .../src/pages/generate/hooks/useStep2Materials.ts | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/apps/web/src/pages/generate/hooks/useStep2Materials.ts b/apps/web/src/pages/generate/hooks/useStep2Materials.ts index 24fcd22fa..06f41797b 100755 --- a/apps/web/src/pages/generate/hooks/useStep2Materials.ts +++ b/apps/web/src/pages/generate/hooks/useStep2Materials.ts @@ -36,19 +36,20 @@ export function useStep2Materials({ /* ── 自动触发智能匹配:选择视频库后自动调用 ── */ const autoTriggeredRef = useRef("") + const { handleSmartMatch } = smartMatch useEffect(() => { // 仅在 auto 模式 + 素材加载完成后自动触发 if (materialMode !== "auto") return if (!selectedLibraryId) return if (materialsLoading) return if (materials.items.length === 0) return - // 防止同一视频库重复触发 - if (autoTriggeredRef.current === selectedLibraryId) return + // 防止同一视频库+同一模式重复触发(模式切换时 key 变化会重新触发) + const triggerKey = `${selectedLibraryId}_${materialMode}` + if (autoTriggeredRef.current === triggerKey) return - autoTriggeredRef.current = selectedLibraryId - smartMatch.handleSmartMatch() - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [selectedLibraryId, materialMode, materialsLoading, materials.items.length]) + autoTriggeredRef.current = triggerKey + handleSmartMatch() + }, [selectedLibraryId, materialMode, materialsLoading, materials.items, handleSmartMatch]) /* ── 手动选择素材 ── */ const handleToggleMaterial = useCallback(