[RFC] 019 - Conversation 会话列表优化 #871
Replies: 3 comments 2 replies
-
虚拟滚动实现方案 |
Beta Was this translation helpful? Give feedback.
-
自动滚动到底部对话参考
为了在使用
以下是一个简单的代码示例: import React, { useEffect, useRef } from 'react';
import { Virtuoso } from 'react-virtuoso';
const MyChatComponent = ({ topicId, messages }) => {
const virtuosoRef = useRef(null);
// 当消息列表更新时(例如,topicId变更或新的消息添加到当前话题),滚动到底部
useEffect(() => {
if (virtuosoRef.current && messages.length > 0) {
virtuosoRef.current.scrollToIndex({ index: messages.length - 1, align: 'end' });
}
}, [topicId, messages.length]);
return (
<Virtuoso
ref={virtuosoRef}
data={messages}
itemContent={(index, message) => (
<div>{message.content}</div>
)}
// 可以设置 initialTopMostItemIndex 以便初始渲染时滚动到底部
initialTopMostItemIndex={messages.length - 1}
// 其他 Virtuoso 属性和方法...
/>
);
}; 在这个组件中,我们使用了 请注意, 最终实现const VirtualizedList = memo(() => {
const virtuosoRef = useRef<VirtuosoHandle>(null);
const [id] = useChatStore(chatSelectors.currentChatKey);
useEffect(() => {
if (virtuosoRef.current) {
virtuosoRef.current.scrollToIndex({ align: 'end', behavior: 'auto', index: 'LAST' });
}
}, [id]);
return chatLoading && data.length === 2 ? null : (
<Flexbox height={'100%'}>
<Virtuoso
atBottomStateChange={setAtBottom}
atBottomThreshold={60 * (mobile ? 2 : 1)}
computeItemKey={(_, item) => item}
data={data}
followOutput={'auto'}
initialTopMostItemIndex={data?.length - 1}
itemContent={itemContent}
overscan={70 * 10}
ref={virtuosoRef}
/>
</Flexbox>
);
});
export default VirtualizedList; |
Beta Was this translation helpful? Give feedback.
-
Beta Was this translation helpful? Give feedback.
-
背景
由于会话列表是chat应用的核心组件因此需要保证其交互体验达到最优一档,并为未来分支会话、话题模板 等场景打好基础。
解决思路
重复渲染
针对重复渲染问题,已通过 #934 优化很多。
ChatList.Before.mp4
ChatList.After.mp4
虚拟滚动
ChatList 和 TopicList 需要替换为虚拟滚动方案,在下方第一条研究
Beta Was this translation helpful? Give feedback.
All reactions