В библиотеке Muuri управление событиями играет ключевую роль в создании интерактивных сеток. Каждое событие, будь то перемещение элемента, сортировка или добавление нового элемента, привязано к конкретной сетке. Отписка от событий необходима для предотвращения утечек памяти, некорректного поведения элементов и конфликтов между обработчиками.
События в Muuri реализованы через метод on, а отписка
осуществляется с помощью метода off. Синтаксис прост, но
имеет ряд нюансов, связанных с областью применения и типами событий.
const grid = new Muuri('.grid');
// Подписка на событие
grid.on('move', (item, event) => {
console.log('Элемент перемещён', item.getElement());
});
// Отписка от события
grid.off('move');
Метод off может использоваться в нескольких
вариациях:
Отписка от всех обработчиков конкретного события
Если вызвать off с названием события, все функции, ранее
привязанные к этому событию, будут удалены.
grid.off('dragStart'); // Все обработчики dragStart будут удаленыОтписка конкретного обработчика Для удаления одного конкретного обработчика необходимо передать его функцию в качестве второго аргумента.
function onDragEnd(item) {
console.log('Перетаскивание завершено');
}
grid.on('dragEnd', onDragEnd);
grid.off('dragEnd', onDragEnd); // Только этот обработчик будет удалёнОтписка всех обработчиков сразу Если вызвать
off без аргументов, Muuri удалит все привязанные
обработчики всех событий, связанных с данной сеткой.
grid.off(); // Полностью очищает все событияПомимо сетки, Muuri позволяет подписываться на события
отдельных элементов через объект item. Это
удобно для локальной обработки изменений конкретного элемента без
влияния на всю сетку.
const item = grid.getItems()[0];
function onItemClick() {
console.log('Элемент кликнут');
}
item.on('click', onItemClick);
item.off('click', onItemClick); // Отписка конкретного элемента
Важно помнить, что при удалении элемента из сетки
(grid.remove(item)) привязанные к нему обработчики
не удаляются автоматически. Для предотвращения утечек
памяти следует явно вызвать item.off() перед удалением.
grid.getItems().forEach(item => item.off()); // Очистка всех обработчиков элементов
grid.off(); // Очистка всех обработчиков сетки
Muuri активно использует события для управления перетаскиванием. Основные события:
dragStart – начало перетаскивания элемента.dragMove – движение элемента во время
перетаскивания.dragReleaseEnd – завершение перетаскивания, элемент
возвращается на позицию.layoutEnd – завершение перестановки элементов после
перетаскивания.Для каждого события может быть несколько подписчиков. Если один обработчик перестаёт быть актуальным (например, после завершения анимации), его следует немедленно отписать, чтобы остальные обработчики продолжали работать корректно.
function onDragMove(item, event) {
console.log('Перемещение элемента');
}
grid.on('dragMove', onDragMove);
// После выполнения задачи
grid.off('dragMove', onDragMove);
При работе с динамически изменяемыми сетками (добавление/удаление элементов) важно:
destroy для полной очистки сетки
вместе с обработчиками, если сетка больше не используется:grid.destroy(); // Уничтожает сетку и очищает все события
Методы off и destroy позволяют управлять
жизненным циклом сетки и элементов без риска утечек памяти и конфликтов
событий. Правильное использование этих методов обеспечивает стабильную
работу интерактивных сеток Muuri даже при больших объёмах данных и
сложной логике перетаскивания.