我知道redux对状态管理很严格,但是在redux中添加一个被认为是no no的对象数组的值?例如:
Moment {_isAMomentObject: true,
_isUTC: false,
_pf: Object,
_locale: Locale,
_d: Fri Jul 01 2016 00:00:00 GMT-1000 (HST)…}

这对我的减速机是否完全安全,还是应该使用// Consider this array of objects on action
action.arr = [ { test: 'me', hail: 'hydra'}, { test: 'you', ring: 'of fire'} ]
// reducer.js
fn = (state = defaultState, action) => {
...
case action.LORD_COMMANDER:
return action.arr.map(v => {
v.john = 'snow'
return v
})
...
}
?
答案 0 :(得分:5)
我认为最好使用Object.assign
。让我们考虑两个例子
const arr = [ { test: 'me', hail: 'hydra'}, { test: 'you', ring: 'of fire'} ];
const arr1 = arr.map(v => {
v.john = 'snow'
return v;
});
console.log(arr, arr1);

正如您所看到的,两个数组中的每个Object
都具有属性john
,因为我们更改的对象具有相同的引用,这对于之前的Array
是不安全的。 ,在下面的示例中,您可以看到仅在第二个Array
对象中具有属性john
,这是因为我们复制了Object
const arr = [ { test: 'me', hail: 'hydra'}, { test: 'you', ring: 'of fire'} ];
const arr1 = arr.map(v => {
return Object.assign({}, v, { john: 'show' })
});
console.log(arr, arr1);

答案 1 :(得分:1)
在这种情况下,你将你的状态变为数组,因为动作中的数组总是不同的,所以是的,你正在改变状态。只要对象不是引用状态,就会完全改变一个脏状态的样本。
var objA = {};
var objB = {};
action.array = [objA, objB];
在这种情况下,当您执行映射时,对数组的引用将是新的,但对对象的引用将是相同的。建议在map函数中使用Object.assign或(...)运算符。或者更好,但我建议调查immutablejs来处理不可变数据