refactor: 优化聊天滚动逻辑,通过css来进行优化

pull/13/head
moonrailgun 4 years ago
parent 14436c63df
commit e094e64e51

@ -1,4 +1,4 @@
import React, { useEffect, useRef } from 'react'; import React from 'react';
import { import {
ChatMessage, ChatMessage,
getMessageTimeDiff, getMessageTimeDiff,
@ -12,60 +12,45 @@ interface ChatMessageListProps {
} }
export const ChatMessageList: React.FC<ChatMessageListProps> = React.memo( export const ChatMessageList: React.FC<ChatMessageListProps> = React.memo(
(props) => { (props) => {
const ref = useRef<HTMLDivElement>(null);
const len = props.messages.length;
useEffect(() => {
// 当会话消息增加时, 滚动到底部
requestAnimationFrame(() => {
if (ref.current === null) {
return;
}
ref.current.scrollTo({
top: ref.current.scrollHeight,
behavior: 'smooth',
});
});
}, [len]);
return ( return (
<div className="flex-1 overflow-y-scroll" ref={ref}> <div className="flex-1 overflow-y-scroll flex flex-col-reverse">
{props.messages.map((message, index, arr) => { <div>
let showDate = true; {props.messages.map((message, index, arr) => {
let showAvatar = true; let showDate = true;
const messageCreatedAt = new Date(message.createdAt ?? ''); let showAvatar = true;
if (index > 0) { const messageCreatedAt = new Date(message.createdAt ?? '');
// 当不是第一条数据时 if (index > 0) {
// 当不是第一条数据时
// 进行时间合并 // 进行时间合并
const prevMessage = arr[index - 1]; const prevMessage = arr[index - 1];
if ( if (
!shouldShowMessageTime( !shouldShowMessageTime(
new Date(prevMessage.createdAt ?? ''), new Date(prevMessage.createdAt ?? ''),
messageCreatedAt messageCreatedAt
) )
) { ) {
showDate = false; showDate = false;
} }
// 进行头像合并(在同一时间块下) // 进行头像合并(在同一时间块下)
if (showDate === false) { if (showDate === false) {
showAvatar = prevMessage.author !== message.author; showAvatar = prevMessage.author !== message.author;
}
} }
}
return ( return (
<div key={message._id}> <div key={message._id}>
{showDate && ( {showDate && (
<Divider className="text-sm opacity-40 px-6 font-normal select-none"> <Divider className="text-sm opacity-40 px-6 font-normal select-none">
{getMessageTimeDiff(messageCreatedAt)} {getMessageTimeDiff(messageCreatedAt)}
</Divider> </Divider>
)} )}
<ChatMessageItem showAvatar={showAvatar} payload={message} /> <ChatMessageItem showAvatar={showAvatar} payload={message} />
</div> </div>
); );
})} })}
</div>
</div> </div>
); );
} }

Loading…
Cancel
Save