diff --git a/apps/ai-game-creator-shell/src/features/project-workspace/ResourceReferenceInput.tsx b/apps/ai-game-creator-shell/src/features/project-workspace/ResourceReferenceInput.tsx index a52d65afe..4c385b91c 100644 --- a/apps/ai-game-creator-shell/src/features/project-workspace/ResourceReferenceInput.tsx +++ b/apps/ai-game-creator-shell/src/features/project-workspace/ResourceReferenceInput.tsx @@ -41,6 +41,7 @@ import { useCallback, useEffect, useImperativeHandle, + useLayoutEffect, useMemo, useRef, useState, @@ -874,7 +875,13 @@ function ResourceReferenceEditor({ // 受控聊天入口在清空/恢复草稿时同步编辑器;普通输入变更若已与当前内容一致则不重建, // 避免每个按键都把光标跳到末尾。 - useEffect(() => { + // + // 这里必须是 layout effect:`value` / `references` 只是宿主对编辑器草稿的回显,宿主状态 + // 更新会晚于编辑器的 Lexical 提交。用被动 effect 时,一次滞后渲染的回调可能在用户已经 + // 继续输入之后才执行,它读到的是旧 `value` 加新编辑器状态,就会把整份草稿重建掉 + // (编辑器再通过 onChange 把空草稿写回宿主,来回清空)。layout effect 与本次提交同帧执行, + // 读到的 props 与编辑器状态属于同一次提交。 + useLayoutEffect(() => { if (value === undefined && references === undefined) return; const desiredValue = value ?? ''; const desiredRefs = references ?? [];