0Pricing
React Academy · Урок

VariableSizeList: динамическая высота строк

Обрабатывайте элементы разной высоты с помощью VariableSizeList и шаблона обратного вызова itemSize.

«VariableSizeList: динамическая высота строк» — бесплатный урок React Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения React Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс React Academy содержит 4 уроков всего.

Когда элементы имеют разную высоту

Иногда строки имеют разную высоту: в списке чата могут чередоваться короткие и длинные сообщения, а в ленте — карточки с разным содержимым. FixedSizeList не подходит для этого, поскольку предполагает одно постоянное значение itemSize.

Для таких случаев react-window предлагает тип списка, позволяющий каждому элементу задавать собственный размер.

VariableSizeList вместо FixedSizeList

VariableSizeList работает как FixedSizeList, но принимает отдельный размер для каждого элемента. Вместо него импортируйте VariableSizeList и передайте функцию, возвращающую размер для указанного индекса.

Всё остальное — функция рендеринга дочернего содержимого и обязательное свойство стиля — остаётся прежним, поэтому переход выполняется быстро.

itemSize как функция

В VariableSizeList itemSize — это функция, которая принимает индекс и возвращает высоту соответствующей строки в пикселях. react-window вызывает её, чтобы вычислить смещения и определить видимую область.

Так можно задать известные высоты, например увеличить высоту строк элементов с изображениями и уменьшить её для обычного текста.

Предварительный расчёт и измерение

Если высота каждой строки известна заранее, функция itemSize может сразу вернуть это значение. Если высота зависит от отрисованного содержимого, строки необходимо измерить после их отображения.

Предварительно рассчитанные значения проще и быстрее; измеренные значения гибче, но требуют дополнительных действий для передачи размеров обратно в список.

resetAfterIndex после измерения

VariableSizeList кэширует смещения элементов для повышения производительности. Если измеренная высота изменяется, необходимо вызвать метод resetAfterIndex у ссылки на список, чтобы он пересчитал позиции начиная с этого индекса.

Если этого не сделать, останутся устаревшие смещения и строки будут выровнены неправильно, поэтому resetAfterIndex — ключ к работе с динамическими измерениями.

Замкнутый круг с высотой

Возникает проблема курицы и яйца: для отрисовки строки нужна её высота, но настоящую высоту можно узнать только после отрисовки. Список должен разместить строку, прежде чем её можно будет измерить.

Решение заключается в том, чтобы сначала отрисовать строку с оценочной высотой, а затем скорректировать её, когда станет известна точная высота.

Оценка, рендеринг, измерение, обновление

Стандартный шаблон таков: сначала отрисовать строки с оценочной высотой, после отрисовки измерить их фактическую высоту с помощью ссылки или ResizeObserver, сохранить измеренное значение и вызвать resetAfterIndex для обновления позиций.

Этот цикл быстро сходится, поэтому после первого прохода измерений список получает правильные смещения.

Функция getItemSize должна быть стабильной

Функция itemSize должна оставаться стабильной между рендерами. Обычно для этого её оборачивают в useCallback, чтобы список не инвалидировал постоянно кэшированные смещения.

Нестабильная функция, объявленная непосредственно в коде, может вызвать ненужные пересчёты и ухудшить производительность, ради которой применяется виртуализация.

Компромисс производительности

VariableSizeList выполняет больше работы, чем FixedSizeList, поскольку не может предполагать постоянное смещение и должна отслеживать размеры каждого элемента. При измерении высоты дополнительные измерения также увеличивают затраты.

Для списков, в которых высота строк действительно различается, эти затраты оправданы; для строк одинаковой высоты FixedSizeList остаётся более быстрым и простым выбором.

Переход к фиксированным размерам с приближением

Если точное динамическое измерение обходится слишком дорого, иногда можно использовать приближение. Объединение строк в несколько классов фиксированной высоты или использование разумного среднего значения позволяет продолжить использовать FixedSizeList.

Такой подход жертвует пиксельно точной компоновкой ради простоты и скорости — это приемлемый компромисс, если небольшие неточности смещения допустимы.

Быстрая проверка: itemSize в VariableSizeList

Вспомните, как VariableSizeList определяет высоту каждой строки.

Итоги: VariableSizeList

VariableSizeList обрабатывает строки разной высоты, получая itemSize в виде функции от индекса. Высоты можно вычислить заранее или измерить; для измеренных высот нужен цикл «оценка — отрисовка — измерение — обновление» с resetAfterIndex.

Сохраняйте функцию itemSize неизменной с помощью useCallback. Это обходится дороже, чем использование FixedSizeList, поэтому для строк одинаковой высоты или когда достаточно приближения выбирайте фиксированный вариант.

Часто задаваемые вопросы

Урок «VariableSizeList: динамическая высота строк» бесплатный?

Да — полный текст урока «VariableSizeList: динамическая высота строк» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс React Academy, подпишись на CoddyKit PRO. Курс React Academy содержит 4 уроков всего.

Чему я научусь в уроке «VariableSizeList: динамическая высота строк»?

Обрабатывайте элементы разной высоты с помощью VariableSizeList и шаблона обратного вызова itemSize. Ты практикуешь React Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать React Academy?

Предыдущий опыт не требуется. React Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «VariableSizeList: динамическая высота строк»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке React Academy?

Да. Каждый урок React Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Проблема отрисовки больших списков
  2. FixedSizeList: отрисовка тысяч элементов
  3. VariableSizeList: динамическая высота строк
  4. Объединение виртуализации с загрузкой данных
← Назад к React Academy