Библиотека Muuri обеспечивает гибкое управление
сеткой элементов с динамическим расположением, фильтрацией, сортировкой
и анимацией. Методы sort и synchronize играют
ключевую роль при управлении порядком элементов и синхронизации
состояния DOM с внутренним состоянием сетки.
sortМетод sort позволяет изменять порядок элементов в сетке
на основе пользовательской функции сравнения. Он используется для
упорядочивания элементов по любым критериям: алфавит, числовые значения,
дата, произвольные свойства элементов.
Синтаксис:
grid.sort([compareFunction], [options])
compareFunction (необязательный) – функция,
определяющая порядок элементов. Аргументы функции — объекты
Item Muuri.
options (необязательный объект) –
дополнительные параметры сортировки:
layout (boolean, по умолчанию true) – если
true, после сортировки сетка будет анимированно
перестроена.sortBy (string, опционально) – ключ, по
которому осуществляется сортировка, если используется предопределённая
схема.Пример сортировки по числовому атрибуту:
const grid = new Muuri('.grid');
grid.sort((a, b) => {
const aValue = parseInt(a.getElement().dataset.value);
const bValue = parseInt(b.getElement().dataset.value);
return aValue - bValue;
});
Особенности работы метода sort:
synchronize.layout: true
перемещения элементов анимируются с учётом текущих настроек сетки.grid.sort((a, b) => {
const aNum = parseInt(a.getElement().dataset.number);
const bNum = parseInt(b.getElement().dataset.number);
if (aNum === bNum) {
return a.getElement().textContent.localeCompare(b.getElement().textContent);
}
return aNum - bNum;
});
synchronizeМетод synchronize используется для синхронизации
внутреннего состояния Muuri с реальным DOM. Он необходим, когда
порядок элементов в DOM изменился внешними средствами (например, через
appendChild, insertBefore, библиотеку jQuery
или другой код), чтобы Muuri корректно отобразил новую структуру.
Синтаксис:
grid.synchronize()
Пример применения:
const grid = new Muuri('.grid');
// Элемент добавлен напрямую в DOM
document.querySelector('.grid').appendChild(newItemElement);
// Синхронизируем сетку с DOM
grid.synchronize();
Особенности:
items:
После вызова synchronize сетка учитывает новые, удалённые
или перемещённые элементы.layout().sort и
synchronizeНа практике часто используют sort для упорядочивания
элементов и synchronize для корректного отражения изменений
в DOM. Например:
// Сортировка элементов по дате
grid.sort((a, b) => {
return new Date(a.getElement().dataset.date) - new Date(b.getElement().dataset.date);
});
// Добавлен новый элемент в DOM вручную
document.querySelector('.grid').appendChild(newItemElement);
// Синхронизация сетки
grid.synchronize();
// Обновление позиции и анимация
grid.layout();
Таким образом, sort управляет логикой порядка
элементов внутри сетки, а synchronize
гарантирует соответствие между DOM и внутренним состоянием
Muuri. Совместное использование этих методов обеспечивает
корректное отображение и динамическую перестройку сетки при любых
изменениях.
synchronize после ручного изменения
DOM, чтобы избежать рассинхронизации сетки.sort с анимацией через layout: true.synchronize и layout в одном цикле для
плавного обновления интерфейса.dataset или другие пользовательские
атрибуты для хранения данных, по которым будет происходить
сортировка.Эти методы вместе позволяют создавать динамические, отзывчивые и анимированные сетки, легко адаптируемые под любые изменения контента.