2016-09-26 3 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 по строке и не назначаете результат нигде, ничего не произойдет. Ничего не будет меняться. В этом-то и дело.

getIn и setIn очень полезны. Они также могут предоставлять значения по умолчанию, если что-то не существует. Я также не думаю, что вам нужен .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

Смежные вопросы