修复输入区受控回写用滞后渲染的 props 清空用户草稿

- apps/ai-game-creator-shell/src/features/project-workspace/ResourceReferenceInput.tsx 的受控同步由 useLayoutEffect 承担:宿主对草稿的回显晚于编辑器提交,被动 effect 可能在上一次渲染的 props 上延迟执行,读到旧 value 加新编辑器状态后重建整份草稿,把刚输入的内容清掉并形成来回清空
- 补注释说明该 effect 必须与本次提交同帧执行,以及直接改成 content 单事实源前的行为约束
This commit is contained in:
2026-09-21 11:59:17 +08:00
parent 7b1f7bdf17
commit 317c8557f4
@@ -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 ?? [];