2016-04-07 35 views
1

必须避免state对象中的任何突变。你能否建议,如何通过rowId使用Immutable.Map()更改行文本?如何使用ImmutableJS Map设置嵌套数组中项目的属性?

setIn在这种情况下,函数似乎不适用于Map吗?

var state = { 
    pages: [ 
     { 
      tiles: [ 
       { 
        rows: [ 
         {rowId: 'row1', text: 'text1'}, 
         {rowId: 'row2', text: 'text2'}, 
         {rowId: 'row3', text: 'text3'} 
         //... 
        ] 
       }, 
       { 
        //... 
       } 
       //... 
      ] 
     } 
     //... 
    ] 
}; 

function onRowUpdateAction(state, rowId, rowText) { 
     var map = Immutable.Map(state); 
     //TODO: Update row text by row id ? 

     return map.toObject(); 
} 
var newState = onRowUpdateAction(state, 'row2', 'updatedText'); 

在此先感谢!

回答

0

setIn与地图和列表很好地发挥。从你写的问题看起来似乎是,你实际上并没有处理深不可变的结构。请注意,创建immutable.Map

immutable.Map({a: {b: 'c'}}) 

创建与关键'a'和值{b: 'c'}不变的地图(如一个普通JS对象)!难怪,不可变的getIn不适用于它。

要使结构非常不可变,请使用immutable.fromJS(这可能是您打算使用的)。

相关问题