我已经构建了一个聊天应用程序,我使用useEffect
来收听messages.length
,以便在到达新消息时向下滚动到底部-messages.length
中的increment
.
然而,也有我删除消息的情况,messages.length
中的decrement
。也就是说,我在删除时也会被滚动到最底部,我希望避免这种行为。消息存储在我的redux存储中,并可作为prop访问。
是否有一种方法可以让useEffect
只侦听增量?
是否有一种方法可以访问消息的先前状态?
还是存储prevLength
变量是不可避免的?
这是我的代码中需要修改的部分:
// Scroll to bottom upon new message:
useEffect(() => {
scrollDown();
}, [messages.length]);
这是整个代码:
import { useState, useEffect} from 'react';
//Components:
import ChatBubble from './ChatBubble';
import ScrollButton from './ScrollButton';
export default function MessagesBoard({ messages }) {
//useState:
const [showScrollButton, setShowScrollButton] = useState(false);
//Event: Scroll to bottom upon new message
useEffect(() => {
scrollDown();
}, [messages.length]);
const scrollDown = () => {
....
};
return (
<div className='chatMessagesBlock'>
<div className='messagesCanvas'>
{messages.map((chatMessage) => {
return (
<ChatBubble
key={msgID}
msgID={msgID}
sender={sender}
msgContent={msgContent}
/>
);
})}
</div>
<ScrollButton
showScrollButton={showScrollButton}
scrollDown={scrollDown}
/>
</div>
);
}
您可以在useRef
:
const prevLength = useRef(0);
useEffect(() => {
if (prevLength.current < message.length) {
scrollDown();
}
prevLength.current = messages.length;
}, [messages.length]);