Reactjs 向数组添加项时redux不可变状态更改

Reactjs 向数组添加项时redux不可变状态更改,reactjs,redux,Reactjs,Redux,我有这个代码示例,基于我在一本关于React的书中看到的非常类似的东西。它基本上说明了在将新项添加到待办事项列表时,减速机中会发生什么: let todos = [ { text: 'first', done: false }, { text: 'second', done: false } ] let state = { todos }; let firstTodosRef = todos[0]; let output = {}; Object.assign(out

我有这个代码示例,基于我在一本关于React的书中看到的非常类似的东西。它基本上说明了在将新项添加到待办事项列表时,减速机中会发生什么:

let todos = [
{
  text: 'first',
  done: false
},
{
  text: 'second',
  done: false
}  
]

let state = { todos };

let firstTodosRef = todos[0];

let output = {};

Object.assign(output, state, {
    todos: [
       ...state.todos,
      {
        text: 'third',
        done: false
      }
    ]
})

console.log(output.todos[0] === firstTodosRef)
最后一行中的console.log输出true,因为Object.assign不执行深度复制。我的问题是,从Redux和不变性的角度来看,这会使代码无效吗?还是因为我们只关心添加一个新项,所以它仍然可以


谢谢

适当的不可变更新应该复制实际正在更新的所有对象和数组,并对其进行修改,但对所有其他现有值使用原始引用。所以,是的,代码似乎是正确的


有关更多示例,请参阅Redux文档中的页面。

从“不变性”的角度来看,这是有效的代码。因为您添加了一个新的todo,所以您创建了一个新的状态对象,而不是对其进行变异,但是因为您保留了前两项,所以在测试新版本和旧版本之间是否相等时,您得到了
true

整体是不同的,但有些部分仍然是相同的。某些部分保持相同的事实可以用来断言,尽管状态发生了变化,您仍然可以保留旧视图的一部分,只更新不同的部分