Метод reloadItems используется для повторного считывания
элементов сетки внутри контейнера Masonry. Он заставляет библиотеку
заново определить набор элементов, участвующих в раскладке. Это особенно
важно в ситуациях, когда структура DOM изменилась: были добавлены новые
элементы, удалены старые или изменены селекторы элементов.
Внутренне Masonry хранит массив объектов элементов, которые участвуют
в расчёте позиции. reloadItems полностью очищает этот
внутренний список и формирует его заново, сканируя контейнер.
masonryInstance.reloadItems()
Метод вызывается у уже созданного экземпляра Masonry.
Пример инициализации:
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200,
gutter: 10
});
Перезагрузка элементов:
msnry.reloadItems();
После вызова Masonry заново определяет все элементы
.grid-item внутри контейнера .grid.
Когда создаётся экземпляр Masonry, выполняется несколько шагов:
itemSelector.Item для каждого найденного
элемента.Метод reloadItems повторяет второй, третий и
четвёртый шаг.
Процесс можно представить следующим образом:
DOM контейнера
↓
Поиск элементов itemSelector
↓
Очистка текущего массива items
↓
Создание новых объектов Item
↓
Обновление внутренней структуры Masonry
При этом позиции элементов не пересчитываются
автоматически. Для этого требуется дополнительный вызов
layout().
reloadItems() и
layout()На практике reloadItems почти всегда используется вместе
с методом layout.
Пример:
msnry.reloadItems();
msnry.layout();
Порядок вызовов важен:
reloadItems() — обновляет список элементовlayout() — пересчитывает позицииБез вызова layout новые элементы будут зарегистрированы,
но их координаты не будут пересчитаны.
Метод применяется в нескольких типичных сценариях.
Если элементы были добавлены в контейнер напрямую через DOM API:
var newItem = document.createElement('div');
newItem.classList.add('grid-item');
grid.appendChild(newItem);
После этого Masonry не узнаёт автоматически о новом элементе.
Необходимо:
msnry.reloadItems();
msnry.layout();
reloadItems особенно полезен при массовых
изменениях:
Пример:
grid.innerHTML = generateItems();
msnry.reloadItems();
msnry.layout();
Здесь полностью меняется содержимое контейнера, поэтому требуется полная пересборка списка элементов.
При удалении элементов из DOM Masonry продолжает хранить их во внутреннем массиве. Это может привести к некорректным расчётам.
Пример удаления:
var item = document.querySelector('.grid-item');
item.remove();
После удаления:
msnry.reloadItems();
msnry.layout();
reloadItems часто путают с методом
addItems.
Полностью пересканирует контейнер.
DOM → полный список элементов
Добавляет только новые элементы в существующий массив.
существующие элементы + новые элементы
Пример использования addItems:
var items = grid.querySelectorAll('.grid-item.new');
msnry.addItems(items);
msnry.layout();
| Метод | Поведение |
|---|---|
| reloadItems | Полная пересборка списка элементов |
| addItems | Добавление конкретных элементов |
| remove | Удаление элементов из Masonry |
reloadItems используется тогда, когда проще пересобрать
список, чем отслеживать изменения вручную.
Каждый элемент Masonry представлен объектом Item.
Внутренне структура выглядит так:
msnry.items = [
Item,
Item,
Item
];
Метод reloadItems:
msnry.itemsItemПсевдокод внутренней логики:
reloadItems() {
this.items = this._itemize(this.element.children);
}
Метод _itemize преобразует DOM-элементы в объекты
Item.
reloadItems использует значение
itemSelector, указанное при инициализации Masonry.
Пример:
var msnry = new Masonry('.grid', {
itemSelector: '.card'
});
При вызове reloadItems Masonry выполнит:
container.querySelectorAll('.card')
Если элементы не соответствуют селектору, они не будут участвовать в раскладке.
HTML:
<div class="grid">
<div class="grid-item"></div>
<div class="grid-item"></div>
</div>
Jav * aScript:
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200,
gutter: 10
});
Добавление элементов:
for (let i = 0; i < 5; i++) {
let item = document.createElement('div');
item.className = 'grid-item';
grid.appendChild(item);
}
msnry.reloadItems();
msnry.layout();
После выполнения:
reloadItems выполняет полный перескан DOM контейнера.
При большом количестве элементов это может быть дорогостоящей
операцией.
Пример нагрузки:
| Количество элементов | Влияние |
|---|---|
| 50 | практически незаметно |
| 200 | лёгкая задержка |
| 1000+ | заметная нагрузка |
Поэтому при работе с большим количеством элементов рекомендуется:
addItemsremovereloadItemsНаиболее распространённая схема работы выглядит следующим образом:
function refreshMasonry() {
msnry.reloadItems();
msnry.layout();
}
Вызов после обновления DOM:
updateContent();
refreshMasonry();
При использовании React, Vue или Angular DOM может обновляться автоматически. Masonry не отслеживает эти изменения.
Поэтому после рендера необходимо вызывать:
msnry.reloadItems();
msnry.layout();
В React это обычно делается после обновления компонента.
Распространённая ошибка — ожидание, что reloadItems
автоматически обновит расположение.
Неправильно:
msnry.reloadItems();
Элементы обновятся во внутреннем списке, но их позиции могут остаться прежними.
Правильно:
msnry.reloadItems();
msnry.layout();
При фильтрации элементов через изменение DOM можно использовать
reloadItems.
Пример:
var items = document.querySelectorAll('.grid-item');
items.forEach(function(item) {
if (!item.classList.contains('active')) {
item.remove();
}
});
msnry.reloadItems();
msnry.layout();
Masonry заново построит сетку только из оставшихся элементов.
Когда элементы содержат изображения, их размеры могут измениться после загрузки.
Типичная схема:
imagesLoaded(grid, function() {
msnry.reloadItems();
msnry.layout();
});
Это предотвращает неправильные расчёты размеров.
После вызова метода обновляются следующие структуры:
msnry.itemsItem.elementItem.sizeПри этом не изменяются:
guttercolumnWidthМетод влияет только на список элементов сетки.
reloadItems()
↓
очистка массива items
↓
поиск DOM элементов
↓
создание объектов Item
↓
обновление структуры Masonry
↓
layout() (отдельный вызов)
↓
пересчёт позиций