fix: 改进消息合并逻辑,确保历史消息不丢失
Some checks failed
Lint / build (20) (push) Has been cancelled
Playwright Tests / test (push) Has been cancelled

1. 简化 initialMessagesRef 初始化
2. 在 mergedMessages 中使用 baseMessages 作为后备
3. 添加 initialMessages 到 useMemo 依赖数组

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Your Name 2026-02-01 11:11:22 +08:00
parent 12ae592746
commit d6073ec091

View File

@ -400,13 +400,8 @@ export function Chat({
// 🆕 保存 initialMessages 的引用,防止历史消息丢失
// 当 useChat 内部状态重置时,我们仍然有初始消息
// 注意:这个 ref 永远保持初始加载的消息,不会更新
const initialMessagesRef = useRef<ChatMessage[]>(initialMessages);
useEffect(() => {
// 只在初始化时设置,不在后续更新
if (initialMessagesRef.current.length === 0 && initialMessages.length > 0) {
initialMessagesRef.current = initialMessages;
}
}, [initialMessages]);
// 调试:监控聊天状态变化 & 持久化生成状态
// 使用 ref 来访问最新的 modelsData,避免依赖数组问题
@ -1102,8 +1097,14 @@ export function Chat({
// 使用 Map 进行去重,以 ID 为键
const messageMap = new Map<string, ChatMessage>();
// 🆕 确保 initialMessagesRef 有值
// 如果 ref 是空的但 initialMessages prop 有值,使用 prop
const baseMessages = initialMessagesRef.current.length > 0
? initialMessagesRef.current
: initialMessages;
// 1. 首先添加初始消息(历史记录)
initialMessagesRef.current.forEach(m => {
baseMessages.forEach(m => {
messageMap.set(m.id, m);
});
@ -1126,9 +1127,9 @@ export function Chat({
return timeA - timeB;
});
console.log("[Chat] Merged messages:", result.length, "(initial:", initialMessagesRef.current.length, ", current:", messages.length, ", appended:", appendedMessages.length, ")");
console.log("[Chat] Merged messages:", result.length, "(base:", baseMessages.length, ", current:", messages.length, ", appended:", appendedMessages.length, ")");
return result;
}, [messages, appendedMessages]);
}, [messages, appendedMessages, initialMessages]);
return (
<>