2016-09-26 78 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