为什么改变我的状态的浅层副本被认为是可以的?

时间:2016-08-22 11:51:38

标签: javascript reactjs redux

请考虑以下事项:

    [SELECT]: (state, action) => {
      let newState = {...state, newState} 
      delete newState[action.payload.key]
      return(newState)
}

为什么我可以改变浅层副本,返回它并仍然满足不改变我的状态的规则?

2 个答案:

答案 0 :(得分:5)

这是可以接受的,因为(至少在您的示例代码中),变异位于浅层对象上,因此您不会修改任何其他代码当前所引用的对象。

可以接受做一个浅拷贝,然后修改一个嵌套对象!关键是您要克隆对象树中您希望更改的深属性路径上的所有对象。

来自Redux FAQ

  

重要的是要记住,无论何时更新嵌套值,   您还必须在您所在州返回其上方任何内容的新副本   树。如果您有state.a.b.c.d,并且想要对d进行更新,   你还需要返回c,b,a和state的新副本。这个   state tree mutation diagram演示了树中的变化   需要一直改变。

答案 1 :(得分:2)

Redux中的reducer应该,这意味着它必须保证它不会改变或影响它自身功能之外的任何东西(即不会产生副作用) 。如果直接改变传递的状态对象,则违反此规则。

通过创建新副本,您肯定知道应用程序的其他任何部分都没有使用它(它刚刚创建,所以它们怎么可能?)。这反过来意味着可以安全地改变它而不用担心奇怪的副作用。