From bcf1e6e349f2416518e67543619f8ac16a538f32 Mon Sep 17 00:00:00 2001 From: feiezha Date: Wed, 4 Nov 2026 01:41:47 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=9B=BE=E6=96=87?= =?UTF-8?q?=E5=8A=A8=E5=9B=BE=E6=92=AD=E6=94=BE=E8=A2=AB=E9=87=8D=E7=BD=AE?= =?UTF-8?q?=E4=B8=8E=E8=BF=9B=E5=BA=A6=E5=81=9C=E6=BB=9E=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- app/aweme/[awemeId]/Client.tsx | 6 +- .../[awemeId]/components/ImageCarousel.tsx | 97 +++++++++---------- app/aweme/[awemeId]/hooks/useImageCarousel.ts | 55 ++++++----- 3 files changed, 83 insertions(+), 75 deletions(-) diff --git a/app/aweme/[awemeId]/Client.tsx b/app/aweme/[awemeId]/Client.tsx index e7beea8..553c790 100644 --- a/app/aweme/[awemeId]/Client.tsx +++ b/app/aweme/[awemeId]/Client.tsx @@ -6,6 +6,7 @@ import { type ReactElement, useCallback, useEffect, + useMemo, useRef, useState, } from "react"; @@ -111,7 +112,10 @@ export default function AwemeDetailClient({ }, []); // 图文轮播状态 - const images = isVideo ? [] : (data as ImageData).images; + const images = useMemo( + () => (isVideo ? [] : (data as ImageData).images), + [data, isVideo], + ); const imageCount = images.length; const imageCarouselState = useImageCarousel({ images, diff --git a/app/aweme/[awemeId]/components/ImageCarousel.tsx b/app/aweme/[awemeId]/components/ImageCarousel.tsx index 82f7b03..8348c9c 100644 --- a/app/aweme/[awemeId]/components/ImageCarousel.tsx +++ b/app/aweme/[awemeId]/components/ImageCarousel.tsx @@ -6,7 +6,6 @@ import { useEffect, useMemo, useRef, - useState, } from "react"; import type { ImageData, LoopMode, ObjectFit } from "../types.ts"; import { releaseMediaElement } from "../utils"; @@ -54,13 +53,15 @@ export const ImageCarousel = memo( ref, ) => { const videoRefs = useRef>(new Map()); + const videoRefCallbacks = useRef< + Map void> + >(new Map()); const activeVideoIdRef = useRef(null); const lastMediaSyncTokenRef = useRef(mediaSyncToken); const pendingSeekRef = useRef<{ imageId: string; progress: number; } | null>(null); - const [readyVideoId, setReadyVideoId] = useState(null); const shouldLoopCurrentVideo = loopMode === "single" || @@ -117,11 +118,13 @@ export const ImageCarousel = memo( // 组件卸载时释放所有残留的