FlatList: apa itu, API dan optimasi di React Native

Penulis: IT Sectr Diterbitkan: 2026-07-05 Waktu membaca: 10 mnt

FlatList — komponen utama React Native untuk menampilkan daftar berperforma tinggi dengan virtualisasi elemen. Tidak seperti ScrollView, FlatList hanya merender elemen yang terlihat di layar, menghemat memori dan prosesor. Komponen ini mendukung gulir horizontal dan vertikal, pull-to-refresh, dan pemuatan tak terbatas. Baca lebih lanjut tentang arsitektur daftar di dokumentasi Meta.

Poin utama

  • FlatList — komponen daftar tervirtualisasi yang hanya merender elemen terlihat dan menggunakannya kembali saat digulir
  • Performa dicapai melalui rendering berjendela (windowing) — elemen di luar layar tidak dibuat
  • API mencakup renderItem, keyExtractor, ItemSeparatorComponent, ListHeaderComponent, dan ListFooterComponent
  • Daftar horizontal dikonfigurasi melalui flag horizontal dan mengubah arah gulir ke sumbu X
  • Optimasi memerlukan konfigurasi keyExtractor yang benar, useMemo untuk data, dan getItemLayout untuk ukuran tetap

Apa itu FlatList?

FlatList — komponen React Native yang mengimplementasikan daftar tervirtualisasi dengan rendering performa tinggi untuk volume data besar. Komponen ini dibangun di atas VirtualizedList dan menyediakan API deklaratif untuk membuat daftar datar dengan kompleksitas apa pun.

FlatList muncul di React Native 0.43 sebagai pengganti ListView yang sudah usang. Menurut data Meta (2026), FlatList digunakan di 85% aplikasi React Native yang bekerja dengan daftar. Komponen ini mendukung semua skenario umum: kontak, umpan berita, katalog produk, obrolan.

Sejarah dan tempat dalam ekosistem

Sebelum kemunculan FlatList, pengembang menggunakan ListView yang memerlukan konfigurasi manual penggunaan ulang sel. FlatList mengotomatiskan proses ini dengan memperkenalkan rendering berjendela mirip dengan RecyclerView di Android (2014) dan UICollectionView di iOS (2012). Dalam proyek modern, FlatList adalah standar de facto untuk semua daftar.

Bagaimana virtualisasi FlatList bekerja

Virtualisasi FlatList — mekanisme di mana komponen hanya merender elemen yang berada di area layar yang terlihat, ditambah buffer kecil di setiap sisi. Elemen lainnya tidak dibuat di DOM, menghemat memori dan mempercepat rendering.

Saat digulir, FlatList menggunakan kembali sel View yang sudah dibuat dengan mengganti data di dalamnya. Ini mencegah pembuatan ribuan View untuk daftar 10.000 elemen. Ukuran buffer default adalah 10 elemen di atas dan di bawah area yang terlihat, tetapi dapat dikonfigurasi melalui windowSize.

ParameterDefaultDeskripsi
windowSize21Jumlah halaman untuk rendering (1 halaman = tinggi layar)
initialNumToRender10Jumlah elemen pada rendering pertama
maxToRenderPerBatch10Maksimum elemen yang dirender dalam satu batch
removeClippedSubviewsfalseMenghapus View di luar layar dari hierarki

Konfigurasi optimal parameter ini memungkinkan menyeimbangkan antara kelancaran gulir dan konsumsi memori. Untuk daftar dengan elemen besar, disarankan mengurangi windowSize menjadi 5-7.

API dan properti utama FlatList

API FlatList mencakup serangkaian properti untuk mengonfigurasi tampilan dan perilaku daftar. Dua properti wajib — data (array data) dan renderItem (fungsi rendering elemen). keyExtractor meningkatkan performa dengan menyediakan kunci unik untuk setiap elemen.

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 menambahkan pemisah antar elemen, ListHeaderComponent dan ListFooterComponent — header dan footer daftar. Ini memungkinkan pembuatan tata letak kompleks tanpa pembungkus tambahan.

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

Optimasi performa FlatList

Optimasi FlatList sangat penting untuk aplikasi dengan ratusan dan ribuan elemen. Tanpa konfigurasi yang benar, daftar dapat melambat saat digulir, mengonsumsi memori berlebihan, dan menyebabkan crash pada perangkat lemah.

Aturan pertama — gunakan keyExtractor dengan pengidentifikasi unik dan stabil. Indeks sebagai kunci menyebabkan penggunaan ulang sel yang salah dan bug status. Kedua — bungkus renderItem dalam useCallback dan gunakan React.memo untuk komponen elemen.

getItemLayout untuk tinggi tetap

Jika semua elemen memiliki tinggi yang sama, getItemLayout memungkinkan FlatList menghitung posisi gulir tanpa mengukur komponen. Ini memberikan peningkatan performa signifikan, terutama saat menggulir ke indeks tertentu.

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 untuk data mencegah render ulang yang tidak perlu. Jika data berasal dari API, transformasikan sekali dan cache. Gunakan React.memo untuk komponen elemen guna menghindari rendering elemen yang tidak berubah.

Daftar horizontal dan karusel

FlatList horizontal dibuat dengan menambahkan properti horizontal={true}. Daftar mengubah arah gulir ke sumbu X, yang nyaman untuk karusel produk, galeri gambar, dan menu horizontal.

Dalam mode horizontal, penting untuk mengonfigurasi snapToInterval dan snapToAlignment dengan benar untuk gulir bertahap, seperti pada karusel native. Komponen secara otomatis menangani momentum dan pelepasan jari, berhenti di elemen terdekat.

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 yang dipanggil saat elemen terlihat berubah. Digunakan untuk analitik, pemuatan lambat gambar, dan aktivasi video hanya untuk kartu yang terlihat.

Pull-to-refresh dan pemuatan tak terbatas

Pull-to-refresh di FlatList diimplementasikan melalui properti refreshing dan onRefresh, yang bekerja bersama dengan status pemuatan. Saat daftar ditarik ke bawah, onRefresh dipanggil, dan flag refreshing memblokir panggilan berulang.

Pemuatan tak terbatas (infinite scroll) dikonfigurasi melalui onEndReached — callback yang dipicu saat mendekati akhir daftar. onEndReachedThreshold menentukan berapa elemen sebelum akhir peristiwa dipicu. Untuk paginasi biasanya digunakan pendekatan cursor-based.

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

Penting: onEndReached dapat dipanggil berkali-kali. Tambahkan flag isLoading untuk memblokir permintaan berulang hingga yang sebelumnya selesai. Gunakan ActivityIndicator di ListFooterComponent untuk menunjukkan pemuatan.

Pertanyaan yang sering diajukan

Apa perbedaan FlatList dengan ScrollView?

FlatList menggunakan virtualisasi — hanya merender elemen terlihat, menghemat memori pada data besar. ScrollView merender semua elemen anak sekaligus, hanya cocok untuk daftar kecil hingga 20-30 elemen. FlatList optimal untuk 100+ elemen.

Bagaimana memperbaiki kedipan (flash) saat memperbarui data FlatList?

Kedipan terjadi saat referensi array data berubah. Gunakan extraData dengan meneruskan dependensi ke sana, atau bungkus renderItem dalam React.memo. Untuk kontrol penuh, terapkan useMemo untuk menstabilkan referensi data.

Mengapa FlatList tidak bisa digulir di dalam scroll-view lain?

FlatList tidak dirancang untuk ditempatkan di dalam ScrollView karena konflik gestur. Solusi: gunakan FlatList dengan nestedScrollEnabled (Android), SectionList untuk bagian, atau pindahkan gulir eksternal ke FlatList melalui ListHeaderComponent.

Bagaimana menganimasi kemunculan elemen FlatList?

Gunakan Animated API di dalam renderItem dengan penundaan berdasarkan indeks. Saat menggulir, terapkan onViewableItemsChanged untuk memicu animasi. Pustaka react-native-reanimated dan react-native-lottie menyederhanakan pembuatan animasi kemunculan yang kompleks.

Apa itu VirtualizedList dan bagaimana hubungannya dengan FlatList?

VirtualizedList — komponen dasar virtualisasi tempat FlatList dan SectionList dibangun. FlatList adalah pembungkus VirtualizedList dengan API yang disederhanakan untuk daftar datar. VirtualizedList menyediakan kontrol tingkat lebih rendah, tetapi jarang digunakan secara langsung.

Ringkasan

  • FlatList — komponen utama React Native untuk daftar berperforma tinggi dengan virtualisasi otomatis dan penggunaan ulang sel
  • Virtualisasi hanya merender elemen terlihat melalui windowSize dan initialNumToRender, menghemat memori pada set data besar
  • Properti wajib: data, renderItem, dan keyExtractor — memastikan daftar bekerja dengan benar
  • getItemLayout mempercepat gulir untuk elemen dengan tinggi tetap, menghilangkan pengukuran dinamis
  • Daftar horizontal dan karusel dikonfigurasi melalui horizontal dan snapToInterval untuk gulir bertahap
  • Pull-to-refresh dan onEndReached mengimplementasikan pemuatan tak terbatas dengan perlindungan terhadap panggilan berulang
  • React.memo dan useCallback wajib untuk renderItem — tanpanya, setiap gulir menyebabkan render ulang semua elemen

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga