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)
我理解Object.assign({}, blah...)vs 之间的区别Object.assign(obj, blah...).让我重新解释一下我的问题:
Redux希望Reducer返回一个新状态而不是改变现有状态.我知道了.在我的例子中,我有一个对象数组.我想交换前两个元素的顺序.在这里查看jsbin示例.
所以我的问题是第三个元素,我应该使用:
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
来自Dan Abramov的推文(Redux的创建者):
常见的Redux误解:你需要深刻克隆状态.现实:如果内部的东西没有改变,保持其参考相同!
https://twitter.com/dan_abramov/status/688087202312491008