比方說,我有這樣的狀態:redux reducer可以返回舊狀態的屬性作爲新狀態的一部分嗎?
state: {
field1: value1,
field2: {a: 5, b: 7}
}
如果減速要更新只field1
,可以減速返回包含新field1
一個新的對象,並作爲新的field2
財產的現有對象state.field2
返回州?還是reducer必須克隆field2?
比方說,我有這樣的狀態:redux reducer可以返回舊狀態的屬性作爲新狀態的一部分嗎?
state: {
field1: value1,
field2: {a: 5, b: 7}
}
如果減速要更新只field1
,可以減速返回包含新field1
一個新的對象,並作爲新的field2
財產的現有對象state.field2
返回州?還是reducer必須克隆field2?
是。不僅回收狀態允許,推薦。
說你的初始狀態是:
{
object1: { /* key-pair values */ },
object2: { /* key-pair values */ },
}
如果您更新您的狀態是這樣的:
// bad
return {
object1: action.object1,
object2: Object.assign({}, state.object2),
}
然後你的應用程序認爲object2
改變它甚至沒有當。這可能會導致不必要的計算並在您的React組件中重新渲染。
只更新你的狀態實際發生改變的部分要好得多。
// good
return Object.assign({}, state, {
object1: action.object1,
});
使用蔓延運營商
return {
...state,
field1: newVal
}
這裏是鏈接詳細一成不變的更新模式
http://redux.js.org/docs/recipes/reducers/ImmutableUpdatePatterns.html
Object.assign()
是你在找什麼,現在你也可以使用擴運算符(.. ),但要注意那些是ES6的特性,所以像IE瀏覽器(甚至11)會崩潰,所以你需要一個polyfill,檢查這個鏈接它會給你更多的信息,也是一個老式的polyfill b rowsers https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/assign
var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { b: 3 , c:2 };
var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 3 , c: 2 }
希望它有助於
注意我的問題不是如何使一個對象的副本,而是它是否是可以接受的減要返回的是對象或數組作爲新國家的性質老態的性質。這不會改變舊的狀態,但它可以回收它。 – travelboy