ReactNative FlatList отображает все элементы одновременно?

Я использую новый компонент списка ReactNative - FlatList.

Кажется, что FlatList отображает все элементы сразу, даже если ячейка на самом деле не видна на экране.

<FlatList data={this.props.items} 
          keyExtractor={(item, index) => generateKey()}
         renderItem={this.renderStrip}/>

 renderItem = ({item}) => { 
   console.warn('rendered!');
   return <View style={{height:200, height: 100}} />
}

Установка 30 пунктов и, похоже, предупреждение "rendered" вызывается в соответствии с общим количеством элементов.

Я думал, что FlatList похож на способ RecycleView в Android, рендерит элемент только тогда, когда он будет видимым на экране.

Я что-то упускаю? Не снизит ли производительность?
Я хотел, чтобы он мог отображать элемент только тогда, когда он должен был отображаться.

Ответ 1

Была такая же проблема в одном из моих приложений. Мне удалось решить эту проблему за пару часов.

⇓⇓⇓

TDLR; Убедитесь, что вы не вкладываете свой FlatList в ScrollList (или другие виды списков).

⇑⇑⇑

Подробное описание:

ВОПРОС

Так же как и в Thread-Opener, сначала мой Flatlist отображает только количество визуализаций, определенных в initialNumToRender, но сразу после этого приложение начинает отображать весь остальной список.

Enviroment

Я использую native-base.io в качестве UI-библиотеки и инкапсулировал содержимое экрана с помощью компонента

Решение

Я понял, что компонент родной базы <Content> заменяет ScrollList. FlatList внутри ScrollList направит вас к странным результатам. Когда я заменил -Component для данного экрана на <View>, все работает так, как ожидалось.

Ответ 2

это то же самое. В документации вы можете найти следующее:

Чтобы ограничить память и обеспечить плавную прокрутку, содержимое отображается асинхронно за кадром. Это означает, что можно прокручивать быстрее, чем скорость заполнения, и на мгновение увидеть пустое содержимое. Это компромисс, который можно настроить в соответствии с потребностями каждого приложения, и мы работаем над его улучшением за кулисами.

Таким образом, он не отображает все элементы одновременно.

и вообще:

Это PureComponent, что означает, что он не будет повторно отображаться, если реквизит останется shallow- равным. Убедитесь, что все, на что зависит ваша функция renderItem, передается как поддержка (например, extraData), которая не является === после обновлений, в противном случае ваш пользовательский интерфейс может не обновляться при изменениях. Это включает в себя данные и состояние родительского компонента.

Дайте мне знать, если вам нужна дополнительная информация.

Ответ 3

FlatList делает слишком много предметов заранее, чтобы получить лучшую скорость заполнения. У нас схожие проблемы. Мы создаем RecyclerListView для решения таких проблем. Очень похоже на RecyclerView, но это только JS. Это быстрее, чем FlatList и битва, проверенная на Flipkart. Можешь попробовать.

Ссылка: https://github.com/Flipkart/ReactEssentials

Подробнее об этом можно прочитать здесь: https://medium.com/@naqvitalha/recyclerlistview-high-performance-listview-for-react-native-and-web-e368d6f0d7ef

Ответ 4

Если Flatlist вложен в ScrollView, он будет отображать все элементы одновременно.