请考虑以下事项:
[SELECT]: (state, action) => {
let newState = {...state, newState}
delete newState[action.payload.key]
return(newState)
}
为什么我可以改变浅层副本,返回它并仍然满足不改变我的状态的规则?
答案 0 :(得分:5)
这是可以接受的,因为(至少在您的示例代码中),变异位于浅层对象上,因此您不会修改任何其他代码当前所引用的对象。
不可以接受做一个浅拷贝,然后修改一个嵌套对象!关键是您要克隆对象树中您希望更改的深属性路径上的所有对象。
来自Redux FAQ:
重要的是要记住,无论何时更新嵌套值, 您还必须在您所在州返回其上方任何内容的新副本 树。如果您有state.a.b.c.d,并且想要对d进行更新, 你还需要返回c,b,a和state的新副本。这个 state tree mutation diagram演示了树中的变化 需要一直改变。
答案 1 :(得分:2)
Redux中的reducer应该纯,这意味着它必须保证它不会改变或影响它自身功能之外的任何东西(即不会产生副作用) 。如果直接改变传递的状态对象,则违反此规则。
通过创建新副本,您肯定知道应用程序的其他任何部分都没有使用它(它刚刚创建,所以它们怎么可能?)。这反过来意味着可以安全地改变它而不用担心奇怪的副作用。