Muuri — это библиотека для создания гибких, анимированных сеток элементов с поддержкой перетаскивания, фильтрации и сортировки. Одним из ключевых аспектов работы с динамическими сетками является синхронизация состояния: обеспечение согласованности данных между визуальным представлением элементов на странице и их внутренним состоянием в библиотеке. Без правильной синхронизации можно столкнуться с багами при сортировке, фильтрации или анимации.
Каждый элемент Muuri представлен объектом Muuri.Item,
который содержит:
element) — прямое
обращение к HTML-узлу.getIndex()) — текущее
положение элемента в сетке.Состояние сетки хранится внутри объекта Muuri и отражает
текущее расположение всех элементов. Важно понимать, что изменение DOM
напрямую не синхронизирует Muuri: изменения нужно
выполнять через API библиотеки.
Для того чтобы сетка корректно отображала изменения, Muuri предоставляет методы:
refreshItems([items])Обновляет свойства элементов.
grid.refreshItems(); // обновление всех элементов
grid.refreshItems([item1, item2]); // обновление конкретных элементов
layout().layout([instant])Применяет пересчитанное расположение элементов на странице.
grid.layout(); // с анимацией
grid.layout(true); // без анимации
layout() Muuri синхронизирует внутренние
координаты с DOM.add(items, [options])
и remove(items, [options])Добавление и удаление элементов:
grid.add(newElements, { index: 0 });
grid.remove([itemToRemove], { removeElements: true });
Важно: после add или remove рекомендуется
вызвать layout() для корректного отображения.
Muuri предоставляет мощную систему событий, которая позволяет держать состояние синхронизированным с внешними данными.
move — элемент изменил позицию.add / remove — добавление
или удаление элемента.filter / sort — элементы
подверглись фильтрации или сортировке.Пример использования события move:
grid.on('move', function (items) {
console.log('Элементы перемещены:', items);
});
При работе с динамическими коллекциями важно поддерживать соответствие между данными и элементами Muuri:
const items = data.map(obj => {
const el = document.createElement('div');
el.textContent = obj.name;
return el;
});
grid.add(items);
Использовать refreshItems() после изменения
данных, чтобы Muuri пересчитал размеры и позиции.
Обновлять свойства элементов через
item.getElement() или методы
update():
item.getElement().textContent = newValue;
item.refresh(); // синхронизирует с DOM
Если данные обновляются динамически с сервера, рекомендуется:
add().remove().layout() после каждой партии изменений.fetch('/api/items')
.then(res => res.json())
.then(newData => {
const newElements = newData.map(obj => document.createElement('div'));
grid.add(newElements);
grid.layout();
});
Для больших сеток:
layout() один раз после нескольких изменений.refreshItems(items) вместо полного
обновления, если известен список изменённых элементов.layout(true).Эти практики позволяют избежать лишних перерисовок и повышают отзывчивость интерфейса.
При динамическом изменении состояния фильтров или сортировки важно:
item.getElement().dataset или другие
критерии.filter() или sort() после
изменения данных.layout() для синхронизации
DOM и внутреннего состояния Muuri.Пример фильтрации по категории:
grid.filter(item => item.getElement().dataset.category === 'active');
grid.layout();
Эта система методов и событий обеспечивает полную синхронизацию состояния, позволяя Muuri корректно работать с динамическими данными и анимациями даже при сложных сценариях добавления, удаления и обновления элементов.