2016-09-26 39 views
1

我有这样的矩阵:ImmutableJS - 更新矩阵的细胞

const initialState = Immutable.fromJS({ 
    board: [ 
      ['','',''], 
      ['','',''], 
      ['','',''] 
     ] 
}); 

而这个功能:

function cellClick(state,i,j) { 

const board = state.get('board'); 
var newBoard = board.map(function(arr) { 
    return arr.slice(); 
    }); 
newBoard.set(i,j,'Hi'); 
alert(newBoard.get(i).get(j)); 
} 
  1. 克隆矩阵(以newBoard OBJ)
  2. 尝试设置矩阵单元格的值 - 不起作用
  3. 尝试输出带有单元格值的消息 - 不起作用

我试过阅读ImmutableJS文档,但找不到任何关于在矩阵(“列表”类型的ImmutableJS)中设置值的内容。

回答

2

您可以使用.setIn([i, j], 'Hi')但是它不会改变该值。这是ImmutableJS的重点。它将返回原始数据结构的稍微更改的版本。如果你只写一条线setIn,并且不把结果赋给任何地方,那么什么都不会发生。没有什么会改变。这才是重点。

getInsetIn是非常有用的。如果某些东西不存在,它们也可以提供默认值。那里我也不认为你需要.slice()。你根本不需要克隆任何东西。

这是一个不可变的数据结构,没有人可以改变它,这是美丽的部分。

const initialState = Immutable.fromJS({ 
    board: [ 
      ['','',''], 
      ['','',''], 
      ['','',''] 
     ] 
}); 

const nextState = initialState.setIn(['board', 0, 0], 'Hi') 

// Now nextState has 'Hi' in it's first column and row. 
// initialState is still the same as it was, it is not changed. 
+0

所以实际上我可以这样做呢? : board.setIn([i,j],'Hi'); alert(board.getIn([i,j])); – ohadinho

+1

不,你不能。您必须将'setIn'调用的结果分配给某个地方,它是不可变的,它不会改变板子,它将返回一个**新**板子,并且应用您的更改。如果您希望在任何地方记录或提醒,您还需要在数据上调用'.toJS()'。 – Olical

+1

我强烈建议阅读ImmutableJS主页上的所有内容,首先https://facebook.github.io/immutable-js/ – Olical