diff --git a/apps/web/src/pages/editing-planner/components/TimelinePanel.tsx b/apps/web/src/pages/editing-planner/components/TimelinePanel.tsx index 867cb6abb..b0e3c1584 100755 --- a/apps/web/src/pages/editing-planner/components/TimelinePanel.tsx +++ b/apps/web/src/pages/editing-planner/components/TimelinePanel.tsx @@ -9,6 +9,7 @@ import React, { useCallback, useEffect, useLayoutEffect, + useMemo, } from "react"; import type { ClipData, ClipType } from "../types"; @@ -59,12 +60,15 @@ const TimelinePanel: React.FC = ({ const [addDuration, setAddDuration] = useState(5); /* ── 根据模式决定可选类型 ── */ - const availableTypes: ClipType[] = - currentMode === "voice_over" - ? ["voice"] - : currentMode === "pip" - ? ["pip"] - : ["voice", "pip"]; // voice_pip 或默认 + const availableTypes: ClipType[] = useMemo( + () => + currentMode === "voice_over" + ? ["voice"] + : currentMode === "pip" + ? ["pip"] + : ["voice", "pip"], // voice_pip 或默认 + [currentMode], + ); /* ── 模式切换时自动更新默认添加类型 ── */ @@ -72,7 +76,7 @@ const TimelinePanel: React.FC = ({ if (!availableTypes.includes(addType)) { setAddType(availableTypes[0]); } - }, [currentMode]); + }, [currentMode, addType, availableTypes]); /* ── 面板尺寸(宽度固定,高度由 useLayoutEffect 实测) ── */ const PICKER_W = 240; // 面板宽度(与 CSS 一致) const GAP = 6; // 面板与"+"卡片的间距