FlatList: wat is het, API en optimalisatie in React Native

Auteur: IT Sectr Gepubliceerd: 2026-07-05 Leestijd: 10 min

FlatList — de primaire React Native-component voor het weergeven van performante lijsten met virtualisatie van elementen. In tegenstelling tot ScrollView rendert FlatList alleen de zichtbare elementen van het scherm, wat geheugen en processor spaart. De component ondersteunt horizontaal en verticaal scrollen, pull-to-refresh en oneindig laden. Lees meer over lijstarchitectuur in de Meta-documentatie.

Belangrijkste punten

  • FlatList — een gevirtualiseerde lijstcomponent die alleen zichtbare elementen rendert en ze hergebruikt tijdens het scrollen
  • Prestaties worden bereikt door venstergebaseerd renderen (windowing) — elementen buiten het scherm worden niet aangemaakt
  • API omvat renderItem, keyExtractor, ItemSeparatorComponent, ListHeaderComponent en ListFooterComponent
  • Horizontale lijsten worden geconfigureerd via de horizontal-vlag en veranderen de scrollrichting naar de X-as
  • Optimalisatie vereist correcte configuratie van keyExtractor, useMemo voor gegevens en getItemLayout voor vaste afmetingen

Wat is FlatList?

FlatList — een React Native-component die een gevirtualiseerde lijst implementeert met performant renderen van grote hoeveelheden gegevens. De component is gebouwd op VirtualizedList en biedt een declaratieve API voor het maken van platte lijsten van elke complexiteit.

FlatList verscheen in React Native 0.43 als vervanging voor de verouderde ListView. Volgens Meta-gegevens (2026) wordt FlatList gebruikt in 85% van de React Native-applicaties die met lijsten werken. De component ondersteunt alle gangbare scenario's: contacten, nieuwsfeeds, productcatalogi, chats.

Geschiedenis en plaats in het ecosysteem

Vóór de komst van FlatList gebruikten ontwikkelaars ListView, dat handmatige configuratie van celhergebruik vereiste. FlatList automatiseerde dit proces door venstergebaseerd renderen te introduceren, vergelijkbaar met RecyclerView in Android (2014) en UICollectionView in iOS (2012). In moderne projecten is FlatList de facto standaard voor alle lijsten.

Hoe werkt FlatList-virtualisatie

FlatList-virtualisatie — het mechanisme waarbij de component alleen de elementen rendert die zich in het zichtbare gedeelte van het scherm bevinden, plus een kleine buffer aan elke kant. De overige elementen worden niet in de DOM aangemaakt, wat geheugen bespaart en het renderen versnelt.

Tijdens het scrollen hergebruikt FlatList reeds aangemaakte View-cellen door de gegevens erin te vervangen. Dit voorkomt het aanmaken van duizenden Views voor een lijst van 10.000 elementen. De standaard buffergrootte is 10 elementen boven en onder het zichtbare gebied, maar kan worden geconfigureerd via windowSize.

ParameterStandaardBeschrijving
windowSize21Aantal pagina's voor rendering (1 pagina = schermhoogte)
initialNumToRender10Aantal elementen bij eerste rendering
maxToRenderPerBatch10Maximum aantal elementen dat in één batch wordt gerenderd
removeClippedSubviewsfalseVerwijderen van Views buiten het scherm uit de hiërarchie

Optimale configuratie van deze parameters zorgt voor een balans tussen scrollvloeiendheid en geheugengebruik. Voor lijsten met grote elementen wordt aanbevolen windowSize te verkleinen naar 5-7.

FlatList API en belangrijkste props

FlatList API bevat een reeks props voor het configureren van de weergave en het gedrag van de lijst. Twee verplichte props — data (gegevensarray) en renderItem (renderfunctie voor elementen). keyExtractor verhoogt de prestaties door een unieke sleutel voor elk element te bieden.

js
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 voegt een scheidingsteken tussen elementen toe, ListHeaderComponent en ListFooterComponent — de kop- en voettekst van de lijst. Dit maakt het mogelijk complexe lay-outs te maken zonder extra omhulling.

js
const styles = StyleSheet.create({
  item: {
    padding: 16,
    backgroundColor: '#fff',
    borderBottomWidth: 1,
    borderBottomColor: '#e0e0e0',
  },
  separator: {
    height: 1,
    backgroundColor: '#ccc',
  },
});

FlatList-prestaties optimaliseren

FlatList-optimalisatie is cruciaal voor applicaties met honderden en duizenden elementen. Zonder correcte configuratie kan de lijst traag worden tijdens het scrollen, overmatig geheugen verbruiken en crashes veroorzaken op zwakkere apparaten.

Eerste regel — gebruik keyExtractor met unieke en stabiele identificatoren. Indexen als sleutels leiden tot onjuist celhergebruik en statusfouten. Tweede — omwikkel renderItem in useCallback en gebruik React.memo voor de component van het element.

getItemLayout voor vaste hoogte

Als alle elementen dezelfde hoogte hebben, stelt getItemLayout FlatList in staat de scrollpositie te berekenen zonder componenten te meten. Dit geeft een aanzienlijke prestatieverbetering, vooral bij scrollen naar een specifieke index.

js
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 voor gegevens voorkomt onnodige herrenderingen. Als gegevens van de API komen, transformeer ze dan eenmalig en cache ze. Gebruik React.memo voor de component van het element om rendering van ongewijzigde elementen te voorkomen.

Horizontale lijsten en carrousels

Horizontale FlatList wordt gemaakt door de prop horizontal={true} toe te voegen. De lijst verandert de scrollrichting naar de X-as, wat handig is voor productcarrousels, afbeeldingsgalerijen en horizontale menu's.

In de horizontale modus is het belangrijk snapToInterval en snapToAlignment correct te configureren voor stapsgewijs scrollen, zoals in native carrousels. De component verwerkt automatisch momentum en het loslaten van de vinger, stoppend bij het dichtstbijzijnde element.

js
<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 die wordt aangeroepen wanneer zichtbare elementen veranderen. Wordt gebruikt voor analyse, lazy loading van afbeeldingen en activatie van video alleen voor zichtbare kaarten.

Pull-to-refresh en oneindig laden

Pull-to-refresh in FlatList wordt geïmplementeerd via de props refreshing en onRefresh, die samenwerken met de laadstatus. Bij het naar beneden trekken van de lijst wordt onRefresh aangeroepen en de refreshing-vlag blokkeert herhaalde aanroepen.

Oneindig laden (infinite scroll) wordt geconfigureerd via onEndReached — een callback die wordt geactiveerd bij het naderen van het einde van de lijst. onEndReachedThreshold bepaalt hoeveel elementen voor het einde de gebeurtenis activeert. Voor paginering wordt meestal een cursor-based aanpak gebruikt.

js
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}
    />
  );
};

Belangrijk: onEndReached kan meerdere keren worden aangeroepen. Voeg een isLoading-vlag toe om herhaalde verzoeken te blokkeren totdat het vorige is voltooid. Gebruik ActivityIndicator in ListFooterComponent om laden aan te geven.

Veelgestelde vragen

Wat is het verschil tussen FlatList en ScrollView?

FlatList gebruikt virtualisatie — rendert alleen zichtbare elementen, wat geheugen bespaart bij grote gegevens. ScrollView rendert alle onderliggende elementen in één keer, geschikt alleen voor kleine lijsten tot 20-30 elementen. FlatList is optimaal voor 100+ elementen.

Hoe los ik flikkering (flash) op bij het bijwerken van FlatList-gegevens?

Flikkering treedt op bij het wijzigen van de referentie van de data-array. Gebruik extraData door de afhankelijkheid daar door te geven, of wikkel renderItem in React.memo. Gebruik useMemo voor volledige controle om gegevensreferenties te stabiliseren.

Waarom scrollt FlatList niet binnen een andere scroll-view?

FlatList is niet ontworpen om in ScrollView te worden genest vanwege gebarenconflicten. Oplossingen: gebruik FlatList met nestedScrollEnabled (Android), SectionList voor secties, of verplaats externe scroll naar FlatList via ListHeaderComponent.

Hoe animeer ik het verschijnen van FlatList-elementen?

Gebruik Animated API binnen renderItem met een vertraging op basis van de index. Gebruik bij scrollen onViewableItemsChanged om animatie te triggeren. Bibliotheken react-native-reanimated en react-native-lottie vereenvoudigen het maken van complexe verschijningsanimaties.

Wat is VirtualizedList en hoe verhoudt het zich tot FlatList?

VirtualizedList — de basiscomponent voor virtualisatie waarop FlatList en SectionList zijn gebouwd. FlatList is een wrapper voor VirtualizedList met een vereenvoudigde API voor platte lijsten. VirtualizedList biedt controle op een lager niveau, maar wordt zelden direct gebruikt.

Samenvatting

  • FlatList — de primaire React Native-component voor performante lijsten met automatische virtualisatie en celhergebruik
  • Virtualisatie rendert alleen zichtbare elementen via windowSize en initialNumToRender, wat geheugen bespaart op grote gegevenssets
  • Verplichte props: data, renderItem en keyExtractor — zorgen voor correcte werking van de lijst
  • getItemLayout versnelt scrollen voor elementen met vaste hoogte door dynamische meting te elimineren
  • Horizontale lijsten en carrousels worden geconfigureerd via horizontal en snapToInterval voor stapsgewijs scrollen
  • Pull-to-refresh en onEndReached implementeren oneindig laden met bescherming tegen herhaalde aanroepen
  • React.memo en useCallback zijn verplicht voor renderItem — zonder hen veroorzaakt elke scroll een herrendering van alle elementen

We ontwikkelen een mobiele applicatie turnkey

IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.

Bespreek het project

Lees ook