Выбор ответа Senior Списки и производительность обновлено

FlashList: подвох переиспользования

Вопрос

После перехода на FlashList в строках «переезжает» локальное состояние: раскрытый блок появляется у других элементов при прокрутке. Почему?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: FlashList переиспользует компоненты строк, и их useState остаётся от прошлых данных. Ради производительности FlashList не размонтирует строки при прокрутке, а подставляет в существующие компоненты новые данные, как RecyclerView.

Варианты ответа

  1. FlashList не поддерживает useState внутри строк и сбрасывает его некорректно при скролле
  2. Не задан keyExtractor, а без него FlashList путает элементы при прокрутке
  3. FlashList переиспользует компоненты строк, и их useState остаётся от прошлых данныхправильный ответ
  4. Нужно увеличить windowSize, чтобы строки не выгружались при прокрутке

Разбор

Ради производительности FlashList не размонтирует строки при прокрутке, а подставляет в существующие компоненты новые данные, как RecyclerView. Локальное состояние компонента при этом сохраняется и оказывается у чужого элемента. Решения: хранить такое состояние снаружи (по id), сбрасывать его при смене id или вовсе избегать состояния в строках. windowSize и отсутствие ключа тут не причина.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме