Muuri — это мощная библиотека для управления сетками элементов с поддержкой анимаций, фильтров и сортировок. Одной из ключевых особенностей является возможность расширения функциональности с помощью плагинов. Плагины позволяют добавлять новые методы, события или модифицировать существующее поведение Muuri без изменения исходного кода библиотеки.
Плагин в Muuri — это объект, который содержит набор хуков и методов, регистрируемых при инициализации сетки. Основные компоненты:
name — уникальное имя плагина, используемое для
идентификации.init(grid) — функция, вызываемая при создании
экземпляра сетки, в которой можно подключить обработчики событий или
изменить внутренние параметры.destroy(grid) — функция, вызываемая при удалении сетки,
предназначенная для очистки ресурсов, удаление слушателей и отмены
изменений.Пример минимальной структуры:
const myPlugin = {
name: 'myPlugin',
init(grid) {
console.log('Плагин инициализирован для сетки:', grid);
},
destroy(grid) {
console.log('Плагин удаляется для сетки:', grid);
}
};
Для подключения к сетке используется опция plugins при
инициализации:
const grid = new Muuri('.grid', {
plugins: [myPlugin]
});
Muuri предоставляет систему событий, через которую плагины могут отслеживать действия пользователя и внутренние изменения элементов. Основные события:
layoutStart / layoutEnd — начало и
окончание перестановки элементов.add / remove — добавление или удаление
элементов из сетки.dragStart / dragEnd — начало и конец
перетаскивания элементов.Пример подписки на события внутри плагина:
const logPlugin = {
name: 'logPlugin',
init(grid) {
grid.on('add', items => console.log('Добавлены элементы:', items));
grid.on('remove', items => console.log('Удалены элементы:', items));
},
destroy(grid) {
grid.off('add');
grid.off('remove');
}
};
Использование on и off позволяет безопасно
подключать и отключать обработчики при инициализации и уничтожении
сетки.
Плагины могут добавлять новые методы к экземпляру
сетки через объект grid:
const colorPlugin = {
name: 'colorPlugin',
init(grid) {
grid.setItemColor = function(item, color) {
item.getElement().style.backgroundColor = color;
};
}
};
После подключения плагина можно вызывать новый метод напрямую:
grid.setItemColor(grid.getItems()[0], 'red');
Важно при этом избегать конфликта с существующими методами Muuri и использовать уникальные имена.
Плагины могут принимать опции конфигурации, передаваемые при инициализации сетки. Например:
const highlightPlugin = (options = {}) => ({
name: 'highlightPlugin',
init(grid) {
const color = options.color || 'yellow';
grid.on('add', items => {
items.forEach(item => item.getElement().style.border = `2px solid ${color}`);
});
},
destroy(grid) {
grid.getItems().forEach(item => item.getElement().style.border = '');
grid.off('add');
}
});
const grid = new Muuri('.grid', {
plugins: [highlightPlugin({ color: 'orange' })]
});
Такой подход делает плагин переиспользуемым и настраиваемым.
Плагины часто взаимодействуют с объектами Item. Основные
методы Item, которые полезны для плагинов:
getElement() — возвращает DOM-элемент.getPosition() — возвращает текущие координаты
элемента.show() / hide() — управляет видимостью
элемента.move(targetIndex) — перемещает элемент в сетке.Пример плагина для автоматического выделения первого элемента:
const firstItemPlugin = {
name: 'firstItemPlugin',
init(grid) {
const firstItem = grid.getItems()[0];
if (firstItem) firstItem.getElement().classList.add('highlight');
}
};
destroy удалять
слушатели и измененные стили, чтобы не возникало утечек памяти.plugins.Создание плагинов в Muuri обеспечивает гибкость и масштабируемость сеток, позволяя добавлять функциональность без изменения исходного кода библиотеки, интегрировать новые методы и управлять поведением элементов на высоком уровне.