DirectProject 聊天投影补 memo,让下游 memo 不再空转

- DirectProjectChatView 的 directTurns 改用 useMemo 缓存,判据为 directEntries / localMessages / directTurnRunning / pendingUserItemId
- 注释写明不缓存时每次渲染都是新数组引用,useDirectProjectTurnStatus 里以 turns 为判据的 useMemo 永远命中不了,读者会误以为 turnStatus 引用稳定
This commit is contained in:
2026-09-22 14:56:50 +08:00
parent 417137baf8
commit c8a8b0b0b8
@@ -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,