将项添加到数组

时间:2018-06-05 15:27:58

标签: reactjs redux

我有这个代码示例,基于我在一本关于React的书中看到的非常类似的东西。它基本上说明了当一个新项目被添加到待办事项列表时在reducer中发生的事情:

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和不变性的角度来看,这是否会使代码无效,还是因为我们只关注添加新项目而无法正常使用?

感谢。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

从“不变性”的角度来看,这是有效的代码。因为你添加了一个新的待办事项,你创建了一个新的状态对象而不是改变它,但是因为你保留了前两个项目,所以当测试新版本和旧版本之间的相等性时,你会得到true

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