Gridstack.js предоставляет мощный механизм для создания динамических сеток, где виджеты можно перемещать и изменять их размер. Для полноценного управления интерфейсом важно безопасно сохранять и восстанавливать состояние сетки, чтобы изменения пользователя не приводили к потере данных или ошибкам в интерфейсе.
Состояние сетки включает позиции и размеры всех элементов. Основными свойствами каждого виджета являются:
x — позиция по горизонтали (столбцы)y — позиция по вертикали (строки)w — ширина в ячейкахh — высота в ячейкахid — уникальный идентификатор виджета (рекомендуется
для привязки данных)Для сохранения состояния используется метод save(),
возвращающий массив объектов с этими свойствами. Пример получения
текущего состояния:
const grid = GridStack.init();
const state = grid.save();
console.log(state);
Сохраненное состояние удобно сериализовать в JSON для отправки на сервер или хранения в локальном хранилище браузера. Важный момент — валидация данных перед восстановлением, чтобы избежать повреждения сетки некорректными объектами:
localStorage.setItem('gridState', JSON.stringify(state));
// Восстановление с проверкой структуры
const savedState = JSON.parse(localStorage.getItem('gridState') || '[]');
if (Array.isArray(savedState) && savedState.every(item => 'x' in item && 'y' in item && 'w' in item && 'h' in item)) {
grid.load(savedState);
}
Ключевые принципы безопасности при хранении состояния:
x, y, w,
h) и типы значений.localStorage, IndexedDB или серверное API.id для корректного восстановления
пользовательских виджетов.Gridstack.js позволяет подписываться на события изменения сетки:
change — срабатывает при изменении позиции или размера
виджетаadded / removed — при добавлении или
удалении виджетовИспользование этих событий позволяет автоматически обновлять
состояние без необходимости ручного вызова save()
после каждого изменения:
grid.on('change', function(event, items) {
const state = grid.save();
localStorage.setItem('gridState', JSON.stringify(state));
});
Это обеспечивает постоянное актуальное состояние сетки даже при сложных манипуляциях пользователем.
Для восстановления состояния после перезагрузки страницы или при повторном входе в приложение важно:
load() для безопасного применения
сохраненного состояния:const savedState = JSON.parse(localStorage.getItem('gridState') || '[]');
grid.load(savedState);
Если необходимо, можно модифицировать состояние перед загрузкой, например, ограничивая размеры или позиции виджетов, чтобы они не выходили за границы новой сетки.
Для многопользовательских приложений безопасное хранение состояния требует синхронизации с сервером. Рекомендуется:
id, x, y, w,
h.Пример отправки состояния на сервер:
fetch('/api/saveGrid', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(grid.save())
});
При восстановлении состояния с сервера важно повторно валидировать данные, чтобы исключить случайное или преднамеренное повреждение сетки некорректными объектами.
Gridstack.js поддерживает конфигурацию ограничения перетаскивания и изменения размеров:
const grid = GridStack.init({
disableResize: false,
disableDrag: false,
float: true,
column: 12
});
Это позволяет контролировать, какие изменения могут быть внесены пользователем, что важно для предотвращения ошибок при последующем восстановлении состояния.
id на сервере.Эти подходы делают работу с Gridstack.js надежной и безопасной, обеспечивая корректное восстановление пользовательского интерфейса и предотвращение потери данных.