diff --git a/apps/ai-game-creator-shell/src/view/project-development/chat/DirectProjectChatView.tsx b/apps/ai-game-creator-shell/src/view/project-development/chat/DirectProjectChatView.tsx index 8e3515ace..0cd590b95 100644 --- a/apps/ai-game-creator-shell/src/view/project-development/chat/DirectProjectChatView.tsx +++ b/apps/ai-game-creator-shell/src/view/project-development/chat/DirectProjectChatView.tsx @@ -1,6 +1,12 @@ import type { UIEventHandler } from 'react'; import type { Ref } from 'react'; -import { useEffect, useImperativeHandle, useRef, useState } from 'react'; +import { + useEffect, + useImperativeHandle, + useMemo, + useRef, + useState, +} from 'react'; import { AGENT_CHAT_SCROLL_BOTTOM_THRESHOLD } from '../../../app/constants'; import { claimInitialTurnForPage } from '../../../app/initialTurnClaims'; @@ -133,12 +139,19 @@ export function DirectProjectChatView({ turnCancelling, uploadFiles, } = chat; - const directTurns = buildDirectChatTurns({ - entries: directEntries, - localMessages, - turnRunning: directTurnRunning, - pendingUserItemId, - }); + // 这份投影要参与下游 memo 的判据,必须自己先缓存:不缓存的话每次渲染都是一份新数组, + // `useDirectProjectTurnStatus` 里以 `turns` 为判据的 `useMemo` 永远命中不了,那层 memo + // 就成了死代码,读代码的人还会误以为 `turnStatus` 是引用稳定的。 + const directTurns = useMemo( + () => + buildDirectChatTurns({ + entries: directEntries, + localMessages, + turnRunning: directTurnRunning, + pendingUserItemId, + }), + [directEntries, localMessages, directTurnRunning, pendingUserItemId], + ); // 「这一轮在跑吗」只从这一个派生入口读:原生真相 / 本地命令在飞 / 最新一轮三态。 const turnStatus = useDirectProjectTurnStatus({ turnRunning: directTurnRunning,