FlatList — den primära React Native-komponenten för att visa prestandalistor med virtualisering av element. Till skillnad från ScrollView renderar FlatList bara de synliga elementen på skärmen, vilket sparar minne och processor. Komponenten stöder horisontell och vertikal rullning, pull-to-refresh och oändlig laddning. Läs mer om listarkitektur i Meta-dokumentationen.
Huvudpunkter
FlatList — en React Native-komponent som implementerar en virtualiserad lista med prestandaeffektiv rendering av stora datamängder. Komponenten är byggd ovanpå VirtualizedList och tillhandahåller ett deklarativt API för att skapa platta listor av valfri komplexitet.
FlatList dök upp i React Native 0.43 som ersättning för den föråldrade ListView. Enligt Meta-data (2026) används FlatList i 85% av React Native-applikationer som arbetar med listor. Komponenten stöder alla vanliga scenarier: kontakter, nyhetsflöden, produktkataloger, chattar.
Före tillkomsten av FlatList använde utvecklare ListView, som krävde manuell konfiguration av cellåteranvändning. FlatList automatiserade denna process genom att införa fönsterbaserad rendering liknande RecyclerView i Android (2014) och UICollectionView i iOS (2012). I moderna projekt är FlatList de facto-standard för alla listor.
FlatList-virtualisering — mekanismen där komponenten endast renderar element som befinner sig i det synliga området på skärmen, plus en liten buffert på varje sida. Övriga element skapas inte i DOM, vilket sparar minne och påskyndar rendering.
Vid rullning återanvänder FlatList redan skapade View-celler genom att ersätta data i dem. Detta förhindrar skapandet av tusentals vyer för en lista med 10 000 element. Standardbuffertstorleken är 10 element ovanför och nedanför det synliga området, men kan konfigureras via windowSize.
| Parameter | Standard | Beskrivning |
|---|---|---|
| windowSize | 21 | Antal sidor för rendering (1 sida = skärmhöjd) |
| initialNumToRender | 10 | Antal element vid första renderingen |
| maxToRenderPerBatch | 10 | Maximalt antal element som renderas i en batch |
| removeClippedSubviews | false | Borttagning av vyer utanför skärmen från hierarkin |
Optimal konfiguration av dessa parametrar gör det möjligt att balansera mellan rullningsjämnhet och minnesförbrukning. För listor med stora element rekommenderas att minska windowSize till 5-7.
FlatList API innehåller en uppsättning props för att konfigurera listans utseende och beteende. Två obligatoriska props — data (dataarray) och renderItem (renderingsfunktion för element). keyExtractor ökar prestandan genom att tillhandahålla en unik nyckel för varje element.
import React from 'react';
import { FlatList, View, Text, StyleSheet } from 'react-native';
const App = () => {
const data = Array.from({ length: 100 }, (_, i) => ({
id: i.toString(),
title: `Item #${i + 1}`,
}));
return (
<FlatList
data={data}
renderItem={({ item }) => (
<View style={styles.item}>
<Text>{item.title}</Text>
</View>
)}
keyExtractor={item => item.id}
ItemSeparatorComponent={() => <View style={styles.separator} />}
/>
);
};ItemSeparatorComponent lägger till en avskiljare mellan element, ListHeaderComponent och ListFooterComponent — listhuvud och listfot. Detta möjliggör skapandet av komplexa layouter utan extra omslag.
const styles = StyleSheet.create({
item: {
padding: 16,
backgroundColor: '#fff',
borderBottomWidth: 1,
borderBottomColor: '#e0e0e0',
},
separator: {
height: 1,
backgroundColor: '#ccc',
},
});Optimering av FlatList är kritisk för applikationer med hundratals och tusentals element. Utan korrekt konfiguration kan listan bli långsam vid rullning, förbruka överdrivet minne och orsaka krascher på svagare enheter.
Första regeln — använd keyExtractor med unika och stabila identifierare. Index som nycklar leder till felaktig cellåteranvändning och tillståndsbuggar. Andra — slå in renderItem i useCallback och använd React.memo för elementkomponenten.
Om alla element har samma höjd tillåter getItemLayout FlatList att beräkna rullningsposition utan att mäta komponenter. Detta ger en betydande prestandaökning, särskilt vid rullning till ett specifikt index.
const ITEM_HEIGHT = 80;
const getItemLayout = (data, index) => ({
length: ITEM_HEIGHT,
offset: ITEM_HEIGHT * index,
index,
});
<FlatList
data={data}
getItemLayout={getItemLayout}
renderItem={renderItem}
/FlatList>useMemo för data förhindrar onödiga omrenderingar. Om data kommer från API, transformera dem en gång och cachelagra. Använd React.memo för elementkomponenten för att undvika rendering av oförändrade element.
Horisontell FlatList skapas genom att lägga till prop horizontal={true}. Listan ändrar rullningsriktning till X-axeln, vilket är bekvämt för produktkaruseller, bildgallerier och horisontella menyer.
I horisontellt läge är det viktigt att korrekt konfigurera snapToInterval och snapToAlignment för stegvis rullning, som i inbyggda karuseller. Komponenten hanterar automatiskt momentum och fingeravlyftning, och stannar vid närmaste element.
<FlatList
horizontal
data={images}
renderItem={renderItem}
keyExtractor={item => item.id}
showsHorizontalScrollIndicator={false}
snapToInterval={CARD_WIDTH + GAP}
snapToAlignment="start"
decelerationRate="fast"
pagingEnabled
onViewableItemsChanged={onViewableItemsChanged}
/>onViewableItemsChanged — callback som anropas när synliga element ändras. Används för analys, lat laddning av bilder och aktivering av video endast för synliga kort.
Pull-to-refresh i FlatList implementeras via props refreshing och onRefresh, som arbetar tillsammans med laddningstillstånd. När listan dras nedåt anropas onRefresh, och flaggan refreshing blockerar upprepade anrop.
Oändlig laddning (infinite scroll) konfigureras via onEndReached — en callback som utlöses när slutet av listan närmar sig. onEndReachedThreshold bestämmer hur många element före slutet som utlöser händelsen. För paginering används vanligtvis cursor-baserad metod.
const ListWithPagination = () => {
const [data, setData] = React.useState([]);
const [page, setPage] = React.useState(1);
const [refreshing, setRefreshing] = React.useState(false);
const loadMore = React.useCallback(async () => {
const newData = await fetchPage(page);
setData(prev => [...prev, ...newData]);
setPage(p => p + 1);
}, [page]);
return (
<FlatList
data={data}
renderItem={renderItem}
keyExtractor={item => item.id}
refreshing={refreshing}
onRefresh={loadMore}
onEndReached={loadMore}
onEndReachedThreshold={0.5}
/>
);
};Viktigt: onEndReached kan anropas flera gånger. Lägg till en isLoading-flagga för att blockera upprepade förfrågningar tills den föregående är klar. Använd ActivityIndicator i ListFooterComponent för att indikera laddning.
Vanliga frågor
FlatList använder virtualisering — renderar endast synliga element, vilket sparar minne vid stora data. ScrollView renderar alla underordnade element på en gång, lämplig endast för små listor upp till 20-30 element. FlatList är optimal för 100+ element.
Blinkning uppstår när referensen till data-arrayen ändras. Använd extraData, skicka beroendet dit, eller slå in renderItem i React.memo. För full kontroll, använd useMemo för att stabilisera datareferenser.
FlatList är inte avsedd att kapslas i ScrollView på grund av gestkonflikter. Lösningar: använd FlatList med nestedScrollEnabled (Android), SectionList för sektioner, eller flytta extern rullning till FlatList via ListHeaderComponent.
Använd Animated API inuti renderItem med fördröjning baserad på index. Vid rullning, använd onViewableItemsChanged för att utlösa animation. Biblioteken react-native-reanimated och react-native-lottie förenklar skapandet av komplexa uppträdandeanimationer.
VirtualizedList — den grundläggande virtualiseringskomponenten som FlatList och SectionList är byggda på. FlatList är ett omslag för VirtualizedList med förenklat API för platta listor. VirtualizedList ger kontroll på lägre nivå men används sällan direkt.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också