#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:
Есть несколько шагов, которые вы можете попробовать, потому что это полностью зависит от набора данных, а также от того, как вы реализовали/использовали в своем проекте.
- Попытайтесь сделать компонент на основе классов
React.PureComponent
- вы также можете попробовать установить
removeClippedSubviews
значениеtrue
.<FlatList removeClippedSubviews ..someOtherProps/>
- Добавьте
keyExtractor
в свойFlatList
, как это:<FlatList keyExtractor={keyExtractor} ... />
- Добавьте
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} />
- набор
initialNumToRender={integer-value}
- Нашел это :Производительность плоского списка
Комментарии:
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. это не работает, я получаю пустой экран. данные не отображаются на экране.