FlatList: vad är det, API och optimering i React Native

Författare: IT Sectr Publicerad: 2026-07-05 Lästid: 10 min

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 virtualiserad listkomponent som renderar endast synliga element och återanvänder dem vid rullning
  • Prestanda uppnås genom fönsterbaserad rendering (windowing) — element utanför skärmen skapas inte
  • API inkluderar renderItem, keyExtractor, ItemSeparatorComponent, ListHeaderComponent och ListFooterComponent
  • Horisontella listor konfigureras via flaggan horizontal och ändrar rullningsriktning till X-axeln
  • Optimering kräver korrekt konfiguration av keyExtractor, useMemo för data och getItemLayout för fasta storlekar

Vad är FlatList?

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.

Historia och plats i ekosystemet

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.

Hur fungerar FlatList-virtualisering

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.

ParameterStandardBeskrivning
windowSize21Antal sidor för rendering (1 sida = skärmhöjd)
initialNumToRender10Antal element vid första renderingen
maxToRenderPerBatch10Maximalt antal element som renderas i en batch
removeClippedSubviewsfalseBorttagning 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 och viktigaste props

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.

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 lägger till en avskiljare mellan element, ListHeaderComponent och ListFooterComponent — listhuvud och listfot. Detta möjliggör skapandet av komplexa layouter utan extra omslag.

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

Optimering av FlatList-prestanda

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.

getItemLayout för fast höjd

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.

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 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.

Horisontella listor och karuseller

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.

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 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 och oändlig laddning

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.

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

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

Vad skiljer FlatList från ScrollView?

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.

Hur åtgärdar man blinkning (flash) vid uppdatering av FlatList-data?

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.

Varför rullar inte FlatList inuti en annan scroll-view?

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.

Hur animerar man FlatList-elementens uppträdande?

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.

Vad är VirtualizedList och hur är det relaterat till FlatList?

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

  • FlatList — den primära React Native-komponenten för prestandalistor med automatisk virtualisering och cellåteranvändning
  • Virtualisering renderar endast synliga element via windowSize och initialNumToRender, vilket sparar minne på stora datamängder
  • Obligatoriska props: data, renderItem och keyExtractor — säkerställer korrekt listfunktion
  • getItemLayout påskyndar rullning för element med fast höjd, vilket eliminerar dynamisk mätning
  • Horisontella listor och karuseller konfigureras via horizontal och snapToInterval för stegvis rullning
  • Pull-to-refresh och onEndReached implementerar oändlig laddning med skydd mot upprepade anrop
  • React.memo och useCallback är obligatoriska för renderItem — utan dem orsakar varje rullning omrendering av alla element

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.

Diskutera projektet

Läs också