Muuri — это мощная библиотека для организации сеток и управления элементами в интерфейсе с поддержкой drag-and-drop, фильтрации, сортировки и анимации. Одним из ключевых инструментов расширения функционала Muuri являются хуки (hooks) и middleware, которые позволяют вмешиваться в жизненный цикл сетки и элементов, модифицировать поведение по своему усмотрению и интегрировать кастомную логику.
Хуки в Muuri представляют собой функции обратного вызова, которые вызываются при определённых событиях сетки или элементов. Они позволяют:
dragStart — срабатывает в момент
начала перетаскивания элемента. Пример:grid.on('dragStart', (item) => {
console.log('Начато перетаскивание:', item.getElement());
item.getElement().style.border = '2px solid blue';
});
dragReleaseEnd — вызывается после
завершения перетаскивания, когда элемент уже возвращён на сетку или
переставлен.layoutStart и
layoutEnd — хуки, позволяющие отслеживать
начало и конец перестановки элементов сетки. Полезны для синхронизации с
анимацией или логикой обновления данных.Хуки регистрируются через метод on экземпляра сетки:
grid.on('eventName', callback);
Где eventName — имя события, а callback —
функция, которая принимает объект item или
items в зависимости от события. В Muuri доступно более 30
различных событий, включая add,
remove,
show, hide,
filter.
Middleware представляет собой промежуточный слой обработки, который может перехватывать действия сетки и элементов, модифицировать их или отменять. Это особенно полезно для реализации кастомной логики, например:
Middleware в Muuri создаются как функции, принимающие объект
state и объект
next, который вызывает следующий
middleware в цепочке.
function customMiddleware(state, next) {
if (state.action === 'drag') {
const item = state.item;
// Ограничение движения по оси X
const pos = state.position;
if (pos.x < 0) pos.x = 0;
}
next(state);
}
grid.use(customMiddleware);
state — объект с текущим состоянием действия, например,
item, position, action.next — функция, вызывающая следующий middleware, что
позволяет строить цепочку обработки.grid.use((state, next) => {
if (state.action === 'drag') {
const maxY = 500;
if (state.position.y > maxY) state.position.y = maxY;
}
next(state);
});
grid.use((state, next) => {
console.log('Middleware срабатывает на действие:', state.action);
next(state);
});
grid.use((state, next) => {
if (state.action === 'layout') {
state.items.forEach(item => {
const el = item.getElement();
el.style.transition = 'transform 0.3s ease';
});
}
next(state);
});
| Хуки | Middleware |
|---|---|
| Срабатывают на событие | Перехватывают действие |
| Не могут блокировать действия | Могут модифицировать или отменять действия |
| Прямо привязаны к событию сетки | Работают в цепочке обработки |
| Используются для реакции на события | Используются для изменения поведения и логики сетки |
next(state) в middleware, чтобы цепочка
действий продолжалась.Muuri предоставляет гибкую систему событий и middleware, которая позволяет полностью контролировать сетку. В реальных проектах это используется для:
Эффективная работа с хуками и middleware превращает стандартную сетку Muuri в мощный инструмент для построения интерактивных и отзывчивых интерфейсов.