В библиотеке Muuri комбинированные условия позволяют реализовать гибкую фильтрацию и динамическое управление элементами сетки. Комбинирование условий может быть построено на основе нескольких критериев: атрибутов элементов, их классов, состояния или пользовательских данных. Это особенно важно при создании сложных интерфейсов с динамическим отображением карточек, галерей или панелей.
Muuri предоставляет метод .filter(), который может
принимать либо строку с селектором, либо функцию, возвращающую булево
значение. Использование функции позволяет реализовать
комбинированные условия:
const grid = new Muuri('.grid');
grid.filter(item => {
const element = item.getElement();
const isActive = element.classList.contains('active');
const isVisible = element.dataset.visible === 'true';
const isCategoryA = element.dataset.category === 'A';
return isActive && isVisible && isCategoryA;
});
Здесь условие
return isActive && isVisible && isCategoryA;
объединяет три критерия, и элемент будет отображаться только если
все три условия одновременно выполняются.
Ключевые моменты:
&&)
используется для обязательного выполнения всех условий.||) применяется для
отображения элемента, если хотя бы одно из условий выполнено.Каждый элемент Muuri может содержать объект данных
(item.getElement().dataset или
item.getData()). Это позволяет строить сложные условия,
например:
grid.filter(item => {
const data = item.getData();
return (data.type === 'image' && data.tags.includes('nature')) ||
(data.type === 'video' && data.duration < 120);
});
В этом примере комбинируются условия для разных типов контента:
изображения должны содержать тег nature, а видео
отображаются только если их длительность меньше 2 минут.
Комбинированные условия могут применяться совместно с сортировкой
.sort(). Например, сначала можно отфильтровать элементы, а
затем отсортировать их по нескольким свойствам:
grid.filter(item => item.getElement().classList.contains('featured'))
.sort((a, b) => {
const aPriority = parseInt(a.getElement().dataset.priority);
const bPriority = parseInt(b.getElement().dataset.priority);
return bPriority - aPriority; // сортировка по убыванию приоритета
});
Такой подход обеспечивает динамическую и управляемую сетку, где фильтры и сортировка взаимодействуют без конфликта.
Комбинированные условия могут меняться во время работы приложения. Muuri поддерживает обновление фильтров на лету с плавной анимацией:
function updateGrid(filterConfig) {
grid.filter(item => {
const el = item.getElement();
const matchesType = filterConfig.types.includes(el.dataset.type);
const matchesStatus = filterConfig.statuses.includes(el.dataset.status);
return matchesType && matchesStatus;
});
}
При изменении filterConfig сетка автоматически обновляет
видимые элементы. Можно комбинировать любые условия — например, включать
элементы по классу, дате добавления, пользовательским тегам и др.
1. Логика AND/OR с несколькими группами условий:
grid.filter(item => {
const el = item.getElement();
const group1 = el.dataset.category === 'A' && el.classList.contains('highlight');
const group2 = el.dataset.category === 'B' && el.dataset.rating > 4;
return group1 || group2;
});
Элементы будут отображаться, если выполняется хотя бы одна из групп условий. Это позволяет гибко комбинировать разные критерии.
2. Фильтрация по диапазону значений:
grid.filter(item => {
const price = parseFloat(item.getElement().dataset.price);
return price >= 50 && price <= 200;
});
Такой фильтр удобен для каталогов товаров, где нужно показывать элементы, соответствующие диапазону цен.
.filter(), чтобы не создавать лишние проходы по DOM.Комбинированные условия в Muuri дают возможность создавать интерактивные, динамические и кастомизированные сетки, где каждый элемент отображается строго в соответствии с набором критериев. Правильная организация условий и оптимизация фильтров обеспечивает высокую производительность и гибкость интерфейса.