2017-03-05 85 views
1

比方說,我有這樣的狀態:redux reducer可以返回舊狀態的屬性作爲新狀態的一部分嗎?

state: { 
    field1: value1, 
    field2: {a: 5, b: 7} 
} 

如果減速要更新只field1,可以減速返回包含新field1一個新的對象,並作爲新的field2財產的現有對象state.field2返回州?還是reducer必須克隆field2?

+0

注意我的問題不是如何使一個對象的副本,而是它是否是可以接受的減要返回的是對象或數組作爲新國家的性質老態的性質。這不會改變舊的狀態,但它可以回收它。 – travelboy

回答

1

是。不僅回收狀態允許,推薦

說你的初始狀態是:

{ 
    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, 
}); 
0

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 } 

希望它有助於

相關問題