В библиотеке Muuri события синхронизации играют ключевую роль при управлении сеткой элементов. Они позволяют отслеживать состояние контейнера и отдельных элементов, а также реагировать на изменения, такие как перестановка, фильтрация или сортировка. Важно понимать различие между событиями grid-level и item-level, чтобы эффективно управлять динамическим контентом.
События сетки активируются при изменении положения, размеров или состояния элементов в контейнере. Основные события:
move – возникает, когда элементы
перемещаются внутри сетки. Может срабатывать как в результате
пользовательской перетаскиваемой сортировки, так и при программных
изменениях.layoutStart – сигнализирует о начале
перестройки сетки. Используется для запуска анимаций или временной
блокировки взаимодействия.layoutEnd – срабатывает после
завершения перестройки. Позволяет синхронизировать интерфейс с
окончательной позицией элементов.filter – вызывается после применения
фильтрации. Передает информацию о видимых и скрытых элементах.sort – срабатывает после сортировки
элементов, полезно для обновления порядкового номера или других
зависимых данных.Пример использования событий сетки:
const grid = new Muuri('.grid');
grid.on('layoutStart', () => {
console.log('Начало перестройки сетки');
});
grid.on('layoutEnd', () => {
console.log('Сетка перестроена');
});
grid.on('move', (items, fromIndex, toIndex) => {
console.log(`Элементы перемещены: from ${fromIndex} to ${toIndex}`);
});
Каждый элемент Muuri (Item) поддерживает собственные
события. Они позволяют управлять поведением отдельного блока:
dragStart – начинается перетаскивание
элемента.dragMove – отслеживание перемещения во
время перетаскивания.dragEnd – завершение перетаскивания,
после чего элемент возвращается на новую позицию.show / hide – вызываются
при показе или скрытии элемента, обычно после фильтрации.move – отдельный элемент уведомляет о
своей перестановке внутри сетки.Пример привязки к событиям элемента:
const item = grid.getItems()[0];
item.on('dragStart', () => {
console.log('Начало перетаскивания элемента');
});
item.on('dragEnd', () => {
console.log('Элемент переставлен');
});
Muuri позволяет объединять события сетки и элементов для точного отслеживания изменений:
Отслеживание перетаскивания и позиции элементов
Использование событий dragEnd и layoutEnd
позволяет обновлять данные на сервере или локальном хранилище после
завершения перемещения.
Фильтрация и сортировка После вызова методов
grid.filter() или grid.sort() автоматически
запускаются соответствующие события (filter и
sort), что позволяет синхронизировать интерфейс, например,
пересчитывать индексы видимых элементов.
Анимация изменений layoutStart и
layoutEnd идеально подходят для запуска CSS-анимаций.
Например, можно временно затемнять сетку или отключать интерактивные
кнопки на время перестройки.
Muuri поддерживает возможность создания собственных событий с помощью
метода emit. Это позволяет расширять поведение сетки, не
изменяя исходный код библиотеки:
grid.emit('customUpdate', { info: 'Данные изменились' });
grid.on('customUpdate', (data) => {
console.log(data.info);
});
Такой подход полезен для интеграции с внешними библиотеками или фреймворками, когда требуется уведомлять сторонние модули о состоянии сетки.
layoutEnd, если необходимо выполнять
действия после полной перестройки сетки.При работе с динамическими элементами (добавление/удаление элементов) события синхронизации помогают поддерживать актуальность состояния сетки:
add – элемент добавлен в сетку. После
вызова grid.add() автоматически запускаются события
layoutStart и layoutEnd.remove – элемент удален. Позволяет
выполнить анимацию скрытия перед окончательной очисткой DOM.Пример динамического добавления:
const newItem = document.createElement('div');
newItem.className = 'item';
grid.add(newItem);
grid.on('layoutEnd', () => {
console.log('Новая сетка готова после добавления элемента');
});
Эффективная работа с событиями синхронизации в Muuri обеспечивает полный контроль над сеткой и её элементами, позволяя реализовывать сложные интерфейсы с динамическими элементами, плавными анимациями и интеграцией с внешними данными.