为什么Redux示例将空对象作为第一个Object.assign()参数传递?

Che*_*eng 13 javascript reactjs redux

redux项目的todoMVC示例中,用于处理待办事项的reducer有以下几行:

export default function todos(state = initialState, action){
    ...
    case EDIT_TODO:
      return state.map(todo =>
        todo.id === action.id ?
          Object.assign({}, todo, { text: action.text }) :
          todo
      )
}
Run Code Online (Sandbox Code Playgroud)

代码的这一部分涉及更新特定的待办事项.我的问题是,因为state.map()将始终返回一个新数组.那么,还有必要这样做:

Object.assign({}, todo, { text: action.text})
Run Code Online (Sandbox Code Playgroud)

它可以只是:

Object.assign(todo, { text: action.text})
Run Code Online (Sandbox Code Playgroud)

UPDATE

我理解Object.assign({}, blah...)vs 之间的区别Object.assign(obj, blah...).让我重新解释一下我的问题:

Redux希望Reducer返回一个新状态而不是改变现有状态.我知道了.在我的例子中,我有一个对象数组.我想交换前两个元素的顺序.在这里查看jsbin示例.

  1. 由于Array.map始终返回一个新数组,因此对返回数组的引用将被设为新数组.校验.
  2. 但是,返回数组中的元素并非都是新元素.对前两个元素的引用是新的.但是,第三项不是.它与旧数组中的第三项相同.

所以我的问题是第三个元素,我应该使用:

Object.assign({}, third_element) 或者干脆 return the third_elment

Redux是否需要一个新的数组,其中包含对其中每个对象的新引用(即使存储在这些新对象中的值与旧对象相同),或只是一个只有新更新元素的新数组?

sma*_*sma 15

这是如何Object.assign运作的本质.它返回目标对象作为其操作的返回值.所以,在第一个语法中:

Object.assign({}, todo, { text: action.text})
Run Code Online (Sandbox Code Playgroud)

要创建一个使用的枚举的属性一个全新的对象todo{ text: action.text}.

如果你这样做:

Object.assign(todo, { text: action.text})
Run Code Online (Sandbox Code Playgroud)

然后todo它本身就是目标对象,因此它将被变异并且将是从中返回的对象Object.assign.

第一种方法是通过创建全新对象的新数组使映射操作完全不可变.

这是一个说明我的意思的jsbin.请注意,在第一个示例中,数组中的原始对象已更改,这意味着状态已发生变异.在第二个中,原始对象保持不变:

https://jsbin.com/boxeserave/edit?html,js,console


wik*_*tor 6

来自Dan Abramov的推文(Redux的创建者):

常见的Redux误解:你需要深刻克隆状态.现实:如果内部的东西没有改变,保持其参考相同!

https://twitter.com/dan_abramov/status/688087202312491008