React - Memo 组件仍在意外重新渲染

React - Memo component still re-rendering unexpectedly

提问人:Coding Ninja123211 提问时间:11/14/2023 最后编辑:Coding Ninja123211 更新时间:11/14/2023 访问量:40

问:

在我的应用程序中,我有一个选择器,它有一个键是聊天 ID,还有一个相应的对象,它是聊天消息数据。ChatMessages

我的聊天页面上有一个选择器,如下所示:

const chatMessages = useSelector((state) => state.messages.messagesData[chatId], {equalityFn: shallowEqual}) || {}

每当创建消息时,此状态都会更新并导致重新呈现。chatMessages

我目前正在映射所有并使用组件显示每个组件:chatMessagesChatMessage

                    Object.values(chatMessages).map((messageObj, index) => {
     

                       return <ChatMessage messageObj={messageObj} storedUsers={storedUsers}  userData={userData} setReplyTo={setReplyTo} chatId={chatId} key={index} newChatData={newChatData} handleDeleteMessage={handleDeleteMessage} />
                    })
            

这是 ChatMessage 组件,它使用 .我这样做,因为每当将新的添加到状态时,我不希望重新呈现所有以前的消息。memoChatMessage

聊天消息:

const ChatMessage = memo(({messageObj, newChatData, storedUsers, handleDeleteMessage, chatId, setReplyTo, userData}) => {
        return <p>{messageObj.text}</p>

}))

但是,在使用 React-Profiler 后,我发现在添加新消息后,所有对象都在重新渲染。检查后,我意识到这是因为道具在变化。如何记住映射状态时使用的 ,这样我就可以避免在添加新消息时重新呈现以前的消息?ChatMessagemessageObjmessageObjChatMessages

我尝试在 上使用,但是我收到一个错误,指出必须在顶层使用,而不是在函数中使用。谢谢。useMemomessageObjuseMemomap

javascript reactjs 反应钩子

评论

2赞 Ori Drori 11/14/2023
从您的代码来看,您似乎在每次渲染上生成一个新数组。replyTo
0赞 Coding Ninja123211 11/14/2023
@OriDrori 是的,但是在查看分析器时,它每次都会将其重新创建为道具。messageObj
1赞 Dave Newton 11/27/2023
当然,代码中有很多水平滚动:(

答: 暂无答案