如果我的州看起来像这样:
const initialState = {
color: 'blue',
sizes: ['S', 'M', 'L'],
}
我想要改变颜色,我的减速器应该正确地返回:
return { ...state, color: newColor };
但状态是否仍会引用旧数组?即使我没有修改数组,这被认为是一个变异吗?这会更好吗?
return {
...state,
color: newColor,
sizes: state.map.sizes(size => size)
}
如果数组包含对象怎么办?
const initialState = {
color: 'blue',
sizes: [
{ color: 'red', size: 'S' },
{ color: 'green', size: 'M' },
{ color: 'blue', size: 'L' }
],
}
这是否意味着我必须这样做以避免改变状态?
return {
...state,
color: newColor,
sizes: state.map.sizes(item => { ...item })
}
另外,有没有理由比使用JSON.stringify和JSON.parse更喜欢Object.assign和spread运算符?
答案 0 :(得分:1)
不,它不是突变。你正在做的事情非常好。
看看:
const obj1 = {
a: 1,
b: 2,
c: 3
};
const obj2 = {
...obj1,
c: 4
};
在创建第二个对象时,第一个对象的任何成员都不会被更改。
在Redux情况下(或实际上,在FP代码库中的任何时间,使用纯函数),只要引用是只读,共享引用就没有坏处。
这意味着当你构造一个新对象时,它的属性可以很好地直接引用其他对象的属性,只要你不改变任何子属性(因为那些子属性会是共享对象)。