В библиотеке Masonry большинство методов возвращают экземпляр самого объекта Masonry. Благодаря этому возможно использовать цепочки вызовов методов (method chaining) — стиль программирования, при котором несколько операций выполняются последовательно в одной инструкции.
Цепочка вызовов позволяет:
Фактически каждый вызов метода возвращает тот же объект Masonry, позволяя немедленно вызвать следующий метод.
После создания экземпляра Masonry можно вызывать несколько методов подряд:
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200
});
msnry.layout()
.reloadItems()
.layout();
В данном фрагменте:
layout() выполняет первичную раскладку элементов.reloadItems() перечитывает элементы сетки.layout() пересчитывает позиции
элементов.Каждый метод возвращает объект msnry, что позволяет
продолжать цепочку.
Цепочка возможна благодаря тому, что методы Masonry внутри своей
реализации возвращают this.
Упрощённая схема метода:
Masonry.prototype.layout = function() {
this._layoutItems(this.items);
return this;
};
this в данном контексте — текущий экземпляр Masonry.
Возврат этого значения позволяет продолжить цепочку вызовов.
Компактность кода
Без chaining:
msnry.reloadItems();
msnry.layout();
msnry.layoutItems(msnry.items);
С chaining:
msnry.reloadItems()
.layout()
.layoutItems(msnry.items);
Логическая последовательность операций
Цепочка показывает, какие действия выполняются над объектом в порядке выполнения:
msnry.appended(newItems)
.layout();
Сначала добавляются элементы, затем выполняется перерасчёт сетки.
Наиболее часто объединяются в цепочку следующие методы Masonry:
| Метод | Назначение |
|---|---|
reloadItems() |
перечитывает элементы сетки |
layout() |
выполняет перерасчёт расположения |
layoutItems() |
раскладывает указанные элементы |
appended() |
добавляет новые элементы |
prepended() |
вставляет элементы в начало |
remove() |
удаляет элементы |
Пример:
msnry.appended(newElems)
.layoutItems(newElems)
.layout();
Последовательность действий:
Одно из основных применений chaining — работа с динамически добавляемыми элементами.
Пример загрузки карточек:
fetch('/data/items.json')
.then(response => response.json())
.then(data => {
var elems = data.map(item => {
var div = document.createElement('div');
div.className = 'grid-item';
div.textContent = item.title;
return div;
});
grid.append(...elems);
msnry.appended(elems)
.layout();
});
Последовательность операций:
Цепочки часто используются совместно с jQuery, поскольку jQuery также активно применяет chaining.
Пример интеграции:
var $grid = $('.grid').masonry({
itemSelector: '.grid-item',
columnWidth: 200
});
$grid.append(newItems)
.masonry('appended', newItems)
.masonry('layout');
В данном случае цепочка включает как методы jQuery, так и вызовы Masonry через API плагина.
Удаление элементов также удобно организовывать через цепочки:
msnry.remove(itemsToDelete)
.layout();
Этапы выполнения:
Такой подход предотвращает появление пустых промежутков в сетке.
При большом количестве вызовов код рекомендуется переносить на новые строки:
msnry
.reloadItems()
.layoutItems(msnry.items)
.layout();
Такой стиль делает структуру цепочки более понятной.
Не все методы подходят для цепочек. Метод не должен возвращать значение, отличное от экземпляра Masonry.
Пример метода, который не используется в цепочках:
var items = msnry.getItemElements();
getItemElements() возвращает массив DOM-элементов, а не
объект Masonry. После такого вызова цепочка прерывается.
Иногда удобнее сохранить промежуточный результат:
var items = msnry.getItemElements();
msnry.layoutItems(items)
.layout();
Здесь:
msnry
.reloadItems()
.layout()
.appended(newElems)
.layoutItems(newElems)
.layout();
Выполняемые действия:
Такой подход часто используется при сложных сценариях динамического обновления интерфейса.
Цепочки вызовов являются частью архитектурной философии библиотеки. Основные принципы:
Методы Masonry проектируются так, чтобы большинство действий можно было объединять в единый поток вызовов. Это позволяет строить лаконичные сценарии работы с динамическими сетками и уменьшает количество служебного кода.