React memo - 自定义相等函数逻辑

React memo - custom equality function logic

提问人:Coding Ninja123211 提问时间:11/14/2023 更新时间:11/14/2023 访问量:23

问:

我有一个这样的组件:ChatMessage

const ChatMessage = memo(({messageObj, replyTo, newChatData, storedUsers, handleDeleteMessage, chatId, 
}, arePropsEqual)

messageObj是一个简单的 JavaScript 对象,如下所示: .{id: 3, text: "test"}

相等函数按预期工作,除非 Message 对象值实际更改,否则不会重新呈现。arePropsEqualChatMessage

相等函数:

function arePropsEqual(oldProps, newProps) {
    // Logs true as expected
    console.log(JSON.stringify(oldProps.messageObj) === JSON.stringify(newProps.messageObj));
    return JSON.stringify(oldProps.messageObj) === JSON.stringify(newProps.messageObj)
}

以前我使用了这个相等函数,它并没有阻止预期的重新渲染:

function arePropsEqual(oldProps, newProps) {
    return oldProps.messageObj === newProps.messageObj
}

此相等函数仅在将 .为什么需要 JSON.stringify?为什么这可以解决比较纯 javascript 对象的问题?谢谢。JSON.stringifymessageObj

JavaScript 反应JS

评论

2赞 Jacob Smit 11/14/2023
它们必须是不同的引用。仅仅因为对象 A 与对象 B 具有相同的数据并不能使 return 为 true。 (严格相等)检查对象的引用是否相同。通过将数据转换为字符串 (JSON.stringify),不再执行引用比较,而是执行值比较。=========
0赞 Coding Ninja123211 11/14/2023
@JacobSmit好的,所以 JSON.stringify 将其从对象转换为字符串数据类型,这意味着现在执行值检查而不是引用检查,由于数据类型是对象,它之前一直在执行引用检查。这是正确的吗?谢谢。===
0赞 Jacob Smit 11/14/2023
是的,这似乎是您提供的片段中发生的事情。

答: 暂无答案