Я хотел бы заняться разработкой VueJ и создать простую игру Minesweeper. Двумерная сетка управляется состоянием Vuex.При нажатии на ячейку я хотел бы открыть ее, чтобы мой текущий код был
[MutationTypes.REVEAL_CELL]: (state, { rowIndex, columnIndex }) => {
state.board[rowIndex][columnIndex].isRevealed = true;
}
К сожалению, это не влияет на пользовательский интерфейс.Эта проблема известна и описана здесь
https://vuejs.org/v2/guide/list.html#Caveats
Документы сказали мне использовать что-то вроде этого
import Vue from "vue";
[MutationTypes.REVEAL_CELL]: (state, { rowIndex, columnIndex }) => {
const updatedCell = state.board[rowIndex][columnIndex];
updatedCell.isRevealed = true;
Vue.set(state.board[rowIndex], columnIndex, updatedCell);
Vue.set(state.board, rowIndex, state.board[rowIndex]);
}
, но это не помогло.Наконец, я попытался создать копию платы, изменить значения и назначить эту копию доске.
[MutationTypes.REVEAL_CELL]: (state, { rowIndex, columnIndex }) => {
const newBoard = state.board.map((row, mapRowIndex) => {
return row.map((cell, cellIndex) => {
if (mapRowIndex === rowIndex && cellIndex === columnIndex) {
cell = { ...cell, isRevealed: true };
}
return cell;
});
});
state.board = newBoard;
}
Это тоже не сработало.У кого-то есть идея?
Я создал Codesandbox, показывающий мой проект
https://codesandbox.io/s/vuetify-vuex-and-vuerouter-d4q2b
, но я думаю, что единственный соответствующий файл - / store / gameBoard /mutations.js и функция REVEAL_CELL