В библиотеке Muuri принцип разделения ответственности проявляется в строгом разграничении задач между контейнерами, элементами сетки и методами управления. Каждый объект в библиотеке выполняет отдельную функцию: контейнер отвечает за позиционирование и организацию элементов, элементы отвечают за визуальное представление и динамическое поведение, а методы — за взаимодействие между компонентами и управление состоянием.
Контейнеры и элементы Контейнеры Muuri создаются
через конструктор new Muuri(container, options). Контейнер
несет ответственность за:
Элементы сетки, создаваемые внутри контейнера, имеют независимое состояние и методы, такие как:
element.show() / element.hide() —
управление видимостью.element.getPosition() — получение координат внутри
контейнера.element.move(target) — перемещение элемента в другой
контейнер или позицию.Такое разделение позволяет изменять поведение элементов без вмешательства в логику контейнера и наоборот.
Muuri предоставляет множество методов, каждый из которых выполняет строго определенную задачу:
add / remove — добавление
и удаление элементов без необходимости вручную менять DOM.filter — отображение только нужных
элементов, оставляя остальные скрытыми, без пересоздания сетки.sort — сортировка элементов по
заданному критерию, обеспечивая консистентность координат.move — перенос элементов между
контейнерами с сохранением их состояния и анимации.Каждый метод действует исключительно в рамках своей ответственности:
filter не сортирует, sort не удаляет, а
move не изменяет порядок элементов внутри исходного
контейнера. Это повышает предсказуемость поведения библиотеки и упрощает
масштабирование сетки.
Muuri поддерживает богатую систему событий, которые позволяют разделять обработку логики между различными компонентами:
dragStart / dragRelease —
отслеживание начала и окончания перетаскивания элемента.layoutStart / layoutEnd —
контроль начала и окончания перерасчета позиций сетки.add / remove — реакция на
динамическое добавление или удаление элементов.События позволяют держать логику интерфейса и обработку данных в
отдельных модулях. Например, сортировка может происходить автоматически
при событии layoutEnd, без вмешательства в сам
контейнер.
Конструктор Muuri принимает объект options, который позволяет разделять конфигурацию:
const grid = new Muuri('.grid', {
dragEnabled: true,
layoutDuration: 400,
layoutEasing: 'ease',
sortData: {
name: el => el.getAttribute('data-name'),
date: el => el.getAttribute('data-date')
}
});
Такое разделение предотвращает «перепутывание» логики и делает систему гибкой и расширяемой.
layoutStart и layoutEnd для запуска сторонних
эффектов.Такой подход упрощает поддержку кода, позволяет подключать новые функции без изменения существующих компонентов и минимизирует вероятность конфликтов между различными частями приложения.
Muuri демонстрирует принципы разделения ответственности на каждом уровне:
Правильное использование этих принципов позволяет создавать масштабируемые, легко настраиваемые и стабильные интерфейсы с динамическими сетками.