我正在使用 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(使用前将#替换为@)