Выбор ответа Senior Списки и производительность обновлено
FlashList: подвох переиспользования
Вопрос
После перехода на FlashList в строках «переезжает» локальное состояние: раскрытый блок появляется у других элементов при прокрутке. Почему?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: FlashList переиспользует компоненты строк, и их useState остаётся от прошлых данных. Ради производительности FlashList не размонтирует строки при прокрутке, а подставляет в существующие компоненты новые данные, как RecyclerView.
Варианты ответа
- FlashList не поддерживает
useStateвнутри строк и сбрасывает его некорректно при скролле - Не задан
keyExtractor, а без него FlashList путает элементы при прокрутке - FlashList переиспользует компоненты строк, и их
useStateостаётся от прошлых данныхправильный ответ - Нужно увеличить
windowSize, чтобы строки не выгружались при прокрутке
Разбор
Ради производительности FlashList не размонтирует строки при прокрутке, а подставляет в существующие компоненты новые данные, как RecyclerView. Локальное состояние компонента при этом сохраняется и оказывается у чужого элемента. Решения: хранить такое состояние снаружи (по id), сбрасывать его при смене id или вовсе избегать состояния в строках. windowSize и отсутствие ключа тут не причина.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.