Собственный плоский список React очень медленно отображает большие данные

#react-native #react-native-flatlist #flatlist

Вопрос:

Я использую flatlist для отображения своих данных в react native, но flatlist очень медленно отображает большой объем данных, и после быстрой прокрутки он повторно отображает данные. Из-за чего мое приложение занимает много времени для отображения полных данных. Я также получил сообщение, подобное

VirtualizedList: You have a large list that is slow to update - make sure your renderItem function renders components that follow React performance best practices like PureComponent, shouldComponentUpdate

Я перепробовал все методы оптимизации плоского списка, но рендеринг плоского списка медленный. Есть предложения, как это решить?

мой компонент flatlist выглядит так

 <FlatList
     data={questionArray}
     showsVerticalScrollIndicator={false}
     renderItem={renderItem}
     keyExtractor={keyExtractor}
/>

const renderItem = useCallback(
        ({ item, index }) => {
                              ....
                             },
        []
    );

const keyExtractor = useCallback((item, index) => index.toString(), []);
 

Комментарии:

1. пожалуйста, не могли бы вы поделиться своим компонентом flatlist ???

2. @HamzaHmem я добавил свой компонент flatlist.

Ответ №1:

Есть несколько шагов, которые вы можете попробовать, потому что это полностью зависит от набора данных, а также от того, как вы реализовали/использовали в своем проекте.

  1. Попытайтесь сделать компонент на основе классов React.PureComponent
  2. вы также можете попробовать установить removeClippedSubviews значение true .
      <FlatList removeClippedSubviews ..someOtherProps/>
     
  3. Добавьте keyExtractor в свой FlatList , как это:
      <FlatList keyExtractor={keyExtractor} ... />
     
  4. Добавьте onEndReached Функцию.

const [загрузчик, установщик] = useState(ложь);

 const onEndReached = (page) => {
  if (next amp;amp; !loader) {
    setPage(page   1)
  }
}

const loadData = async () => {
  setLoader(true);
  const resp = await getData();
  setLoader(false);
}



<FlatList ...someprops onEndReached={onEndReached} />
 
  1. набор initialNumToRender={integer-value}
  2. Нашел это :Производительность плоского списка

Комментарии:

1. мой набор данных большой и не поддерживает разбиение на страницы. Так что ни одно из вышеперечисленных решений для меня не работает.

2. есть какое-нибудь другое решение?

3. @venomous31 можете ли вы поделиться небольшим рабочим кодом на snack.expo.io ? Вы увидите, какое решение лучше всего подходит для вашего варианта использования.

Ответ №2:

Может быть, это возможно с помощью «useMemo()»

    const memoizedValue = useMemo(() => renderItem, [array]);

        <FlatList
            keyExtractor={keyExtractor}
            data={array}
            renderItem={memoizedValue}
        />
      const renderItem = ({ item }) => (
         <ListItem/>
      ) 
 

Комментарии:

1. это не работает, я получаю пустой экран. данные не отображаются на экране.