Библиотека Muuri предоставляет мощный инструмент для создания динамичных сеток элементов с возможностью перетаскивания, фильтрации и сортировки. Управление жизненным циклом элементов и самой сетки является ключевым аспектом при построении интерактивных интерфейсов. Жизненный цикл включает инициализацию сетки, добавление и удаление элементов, их обновление и окончательное уничтожение сетки.
Для начала работы с Muuri создается объект сетки с помощью
конструктора Muuri. Он принимает контейнер и объект
настроек:
const grid = new Muuri('.grid', {
dragEnabled: true,
layout: {
fillGaps: true,
rounding: true
},
sortData: {
name: (item, element) => element.getAttribute('data-name'),
date: (item, element) => parseInt(element.getAttribute('data-date'), 10)
}
});
Ключевые моменты при инициализации:
Инициализация автоматически вызывает внутреннюю функцию layout, формируя начальное расположение элементов.
Muuri позволяет добавлять новые элементы как в процессе инициализации, так и динамически после создания сетки:
const newItem = document.createElement('div');
newItem.classList.add('item');
newItem.setAttribute('data-name', 'Новый элемент');
grid.add(newItem, { index: 0 });
Особенности метода add:
items может быть одним элементом или массивом
элементов.index задает позицию нового элемента в
сетке.Для удаления элементов используется метод remove:
const itemsToRemove = grid.getItems('.remove-me');
grid.remove(itemsToRemove, { removeElements: true });
Важные моменты:
removeElements: true гарантирует удаление DOM-элемента,
иначе он только исключается из сетки.hide с
анимацией, затем remove.Обновление жизненного цикла подразумевает внесение изменений в существующие элементы:
grid.updateItems().layout();
updateItems синхронизирует данные с
DOM-элементами.layout перераспределяет элементы с учетом новых
размеров или порядка.grid.update(itemsArray).layout();.Muuri предоставляет события жизненного цикла для drag & drop:
grid.on('dragStart', (item) => console.log('Начало перетаскивания', item));
grid.on('dragReleaseEnd', (item) => console.log('Завершение перетаскивания', item));
Ключевые события:
dragStart, dragMove,
dragReleaseStart, dragReleaseEnd – отслеживают
полный цикл перетаскивания.layoutStart, layoutEnd – сигнализируют о
начале и завершении перестановки элементов.Жизненный цикл элементов тесно связан с их видимостью и порядком:
grid.filter((item) => item.getElement().getAttribute('data-category') === 'active');
grid.sort('name', { descending: false });
filter не удаляет элементы, а скрывает их, сохраняя в
памяти сетки.sort изменяет порядок элементов, учитывая
пользовательские данные (sortData).layout, поддерживая корректное позиционирование.Завершение жизненного цикла включает полное уничтожение сетки:
grid.destroy();
destroy все события отсоединяются.removeElements: true.destroy, чтобы избежать накопления обработчиков
событий.layout для повышения
производительности.layoutEnd для точного управления визуальным
состоянием.Эффективное управление жизненным циклом в Muuri обеспечивает стабильность интерфейса, предсказуемость поведения элементов и легкость интеграции сетки с другими компонентами веб-приложения.