对于不可变对象,展开运算符与 JSON.parse(JSON.stringify(...))

2024-04-02

我正在使用 Redux,最近遇到了一个问题,我将消息添加到数组中,但 Redux 状态没有在 React 上发出重新渲染。我正在使用react-redux为此的图书馆。这是我遇到的问题的一个例子:

// State structure
structure: { messages: {}, groups: {} }

// ---
newState = { ...prevState };
newState.messages[action.message.group] = action.message;
return newState; 

这是更新状态,但它没有触发反应组件的更新,而是替换newState = { ...prevState } with newState = JSON.parse(JSON.stringify(prevState))解决了这个问题。

谁能详细解释一下为什么会发生这种情况?我的印象是扩展运算符创建了对象的克隆,直到现在我才遇到过任何问题。


React-Redux 连接的组件会进行浅层严格相等检查来决定是否要更新。看http://redux.js.org/docs/faq/ImmutableData.html http://redux.js.org/docs/faq/ImmutableData.html

扩展运算符类似于 Object.assign,并且不会深度克隆对象。 JSON 之所以有效,是因为您创建了一个全新的对象,它将通过严格的相等检查,但是您的所有组件都会不必要地更新,因为现在没有任何内容会通过严格的相等检查。

Object.assign({}, ...prevState, ...newState) 将创建一个新的顶级对象,但它不会为嵌套在 prevState 或 newState 中的任何对象创建新对象。但是,您必须仔细更新嵌套对象,以避免不必要的重新渲染。对于深度嵌套的对象和数组来说,这可能会变得很棘手。

我建议检查 Seamless-immutable 或 immutable 包来管理状态。此外,重新选择库可以帮助您提取特定于组件需求的记忆对象。


更新 08/16/2020

the immer https://github.com/immerjs/immer图书馆是当今最好的状态管理图书馆之一

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于不可变对象,展开运算符与 JSON.parse(JSON.stringify(...)) 的相关文章

随机推荐