Сначала немного контекста:
Я создаю приложение mineswheeper на основе VueJS. Моя сетка - это дерево объектов: каждый объект Box имеет свойство «соседи», которое содержит объекты Box, которые являются ближайшими блоками.
Структура круглая, но в порядке.
Теперь проблема:
Сначала я попробовал небольшую сетку (5x5). Она работала нормально, но при попытке создать большую сетку (50x50) Vue вызывал ошибку «Превышен максимальный размер стека вызовов» при настройке наблюдателей, вот журнал
Дерево кажется слишком большим, чтобы vue мог справиться с реактивностью.
Это было подтверждено при замораживании моего объекта, и он работал нормально (без ошибки стека вызовов):
data() {
const game = new MinesWheeper(30, 30, 40)
Object.freeze(game)
return {
game
}
}
Но реактивность (очевидно) понижена из-за замораживания. Тем не менее мне нужна реактивность, чтобы открывать ящики при нажатии.
Вот мои вопросы / выводы, которые я нашел:
Вы когда-нибудь сталкивались с этой проблемой стека вызовов с Vue, или я что-то упускаю?
Есть ли способ заставить реактивность работать на VueJS с такой структурой объектов? (Является ли VueX частью решения? Я этого не знаю)
Или мне стоит подумать об использовании чего-то еще, кроме VueJS? (Сделать это в ванили ??)
Заранее спасибо, извините, если мой пост грязный, это мой первый пост за 5 лет, я очень нервничаю, лол
Изменить: вот как выглядит игровой объект:
game: { // MinesWheeper
_grid: { // Grid
"_bombsNumber": 40
_boxes: [ // Array of Box
{
"_hasBomb": true
"_index": 0
"_isRevealed": false
"_neighbors": [Box, Box, Box, Box]
"hasBomb": true
"index": 0
"isRevealed": false
"nearBombs": 1
}
]
}
}
Более того, при нажатии на Box мне нужно либо: - завершить игру, если Box.hasBomb истинно; - показать содержимое (если в нем нет бомбы) - либо распространить вызов функции detect (), если Box.nearBombs равен 0
мой метод Box.reveal () рекурсивен:
reveal() {
if (this._isRevealed) return
this._isRevealed = true
if (this.hasBomb) {
console.log('Game over')
} else if (this.nearBombs === 0) {
this._neighbors.forEach(neighbor => {
neighbor.reveal()
})
}
}
Вот почему я думаю, что мне нужна реактивность, чтобы обновлять представление при каждом вызове Box.reveal