2016-09-07 40 views
0

如何更新嵌套的不可變的地圖項目而不會使整棵樹變得臃腫?已更新的嵌套在不可變的immutable.js中

例如:

var tree = Map({ 
branch1:Map([]), 
branch2:Map({ 1: Map({id:1,value:'hello'}) }), 
}); 

如何更新tree.branch2.1.value?

這會導致branch1獲得新的副本嗎?

我在Reactjs Redux應用程序中使用它。因爲我還使用選擇,我想改變的branch2值,而不鮑勃迪倫BRANCH1也讓選擇wonnt重新計算的Immutable.js對象再次

+0

請參閱https://github.com/reactjs/reselect - 創建memoized選擇器的一個很好的庫,這樣您就不必擔心它們會在狀態更新時重新計算。 – elijah

回答

3

更改值將總是返回一個完全新的對象,而不是突變它。這基本上就是圖書館的全部重點。如果您擔心基於狀態更改的其他方面進行不必要的重新呈現,則應使用shouldComponentUpdate生命週期方法確保只在應用程序狀態的該部分的發生更改時才更新組件,而不僅僅是當這是一個新的對象。

對於你的情況,最好使用setIn方法來創建不可變的地圖。

tree.setIn(['branch2', 1, 'value'], 'newValue');