DirectProject 聊天投影补 memo,让下游 memo 不再空转
- DirectProjectChatView 的 directTurns 改用 useMemo 缓存,判据为 directEntries / localMessages / directTurnRunning / pendingUserItemId - 注释写明不缓存时每次渲染都是新数组引用,useDirectProjectTurnStatus 里以 turns 为判据的 useMemo 永远命中不了,读者会误以为 turnStatus 引用稳定
This commit is contained in:
+20
-7
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user