这是很常见的事情,而且实际上非常令人畏惧。据我所知,纯 JS 中还没有真正好的、被广泛采用的解决方案。最初,Object.assign
使用的方法:
return Object.assign({}, state, {
categories: Object.assign({}, state.categories, {
Professional: Object.assign({}, state.Professional, {
active: true
})
})
});
我承认,这太简单和麻烦了,但我不得不说,我们用这种方法构建了一些大型应用程序,除了字符数量之外,它还不错。如今,最流行的方法是使用对象传播 https://babeljs.io/docs/plugins/transform-object-rest-spread/:
return {
...state,
categories: {
...state.categories,
Professional: {
...state.categories.Professional,
active: true
}
}
}
第二种方法更加简洁,因此如果您使用纯 JS,那么它似乎是一个不错的选择。
在 Immutable.js 中,我不得不承认它更容易,你只需执行下一步
return state.updateIn(['categories', 'Professional'], x => x.set('active', true));
但它有其自身的缺点和注意事项,因此最好在做出决定之前认真考虑一下。
关于改善状态的最后一个问题 - 通常最好不要有如此深的嵌套(分开你的关注点,很多时候字段并不相互依赖 - 就像active
状态可以分离到另一个对象),但由于不了解您的领域,所以很难说。而且,这被认为是正常的事情正常化 http://redux.js.org/docs/recipes/reducers/NormalizingStateShape.html您的数据。