Gridstack.js предоставляет мощный механизм для создания динамических сеток с поддержкой перетаскивания и изменения размеров элементов. Для полноценного использования интерактивной сетки важно уметь сохранять состояние сетки — позиции, размеры и порядок виджетов — и при необходимости восстанавливать его. Рассмотрим детально доступные методы и подходы.
Сохранение состояния начинается с извлечения актуального расположения
элементов. Для этого используется метод
save(), который возвращает массив
объектов, содержащих данные о каждом виджете:
let grid = GridStack.init();
let serializedData = grid.save();
console.log(serializedData);
Каждый объект массива имеет структуру:
x — координата элемента по оси X (столбец сетки).y — координата по оси Y (строка сетки).w — ширина элемента в единицах сетки.h — высота элемента в единицах сетки.id — уникальный идентификатор виджета (если
задан).el.dataset или el.getAttribute.Метод save() полезен для сериализации состояния
в JSON, который можно отправлять на сервер или сохранять в
локальное хранилище.
Для восстановления сетки используется метод
load(), который принимает массив объектов,
полученный методом save():
let grid = GridStack.init();
grid.load(serializedData);
Особенности работы метода load():
content или шаблон элемента.addWidget() для динамического создания элементов перед
восстановлением.Пример с динамическим созданием:
serializedData.forEach(node => {
grid.addWidget(`<div class="grid-stack-item" id="${node.id}">
<div class="grid-stack-item-content">Контент</div>
</div>`,
{x: node.x, y: node.y, w: node.w, h: node.h});
});
Gridstack.js поддерживает события, которые позволяют отслеживать изменения состояния сетки и сохранять их автоматически. Основные события:
change — вызывается при изменении позиции или размера
виджета.added — при добавлении новых элементов.removed — при удалении элементов.Пример автоматической сериализации в localStorage:
grid.on('change', function(event, items) {
let data = grid.save();
localStorage.setItem('grid-state', JSON.stringify(data));
});
Для восстановления состояния при загрузке страницы:
document.addEventListener('DOMContentLoaded', () => {
let savedData = JSON.parse(localStorage.getItem('grid-state') || '[]');
if (savedData.length) grid.load(savedData);
});
Метод save() возвращает базовые свойства сетки, но для
сложных приложений часто требуется сохранять пользовательские
данные. Gridstack позволяет расширять объекты с помощью опций
data-gs-* или встроенных свойств:
<div class="grid-stack-item" data-gs-id="widget1" data-gs-color="red">
<div class="grid-stack-item-content">Контент</div>
</div>
При сохранении можно вручную добавлять эти атрибуты:
let serializedData = grid.save().map(node => ({
...node,
color: document.getElementById(node.id)?.dataset.color
}));
Это позволяет полностью восстанавливать не только позиции, но и внешний вид или функциональность виджетов.
Для многопользовательских приложений или сохранения состояния на сервере лучше использовать JSON. Типичный поток:
grid.save().JSON.stringify(data).fetch или
axios.grid.load(data).Пример синхронизации с сервером:
async function saveGrid() {
let data = grid.save();
await fetch('/save-grid', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(data)
});
}
async function loadGrid() {
let response = await fetch('/load-grid');
let data = await response.json();
grid.load(data);
}
id, чтобы избежать конфликтов при загрузке.change и added для
реального времени сохранения, особенно в приложениях с
динамическими изменениями.Эти методы обеспечивают надежное и гибкое управление состоянием сетки в Gridstack.js, позволяя создавать интерактивные и динамические интерфейсы с сохранением пользовательских настроек и позиции элементов.