From c8a8b0b0b8d6b3aedf29da554551da6773e614c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Tue, 22 Sep 2026 14:56:50 +0800 Subject: [PATCH] =?UTF-8?q?DirectProject=20=E8=81=8A=E5=A4=A9=E6=8A=95?= =?UTF-8?q?=E5=BD=B1=E8=A1=A5=20memo=EF=BC=8C=E8=AE=A9=E4=B8=8B=E6=B8=B8?= =?UTF-8?q?=20memo=20=E4=B8=8D=E5=86=8D=E7=A9=BA=E8=BD=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - DirectProjectChatView 的 directTurns 改用 useMemo 缓存,判据为 directEntries / localMessages / directTurnRunning / pendingUserItemId - 注释写明不缓存时每次渲染都是新数组引用,useDirectProjectTurnStatus 里以 turns 为判据的 useMemo 永远命中不了,读者会误以为 turnStatus 引用稳定 --- .../chat/DirectProjectChatView.tsx | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) 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,