FlatList: ano ito, API at pag-optimize sa React Native

May-akda: IT Sectr Nai-publish: 2026-07-05 Oras ng pagbabasa: 10 min

FlatList — ang pangunahing bahagi ng React Native para sa pagpapakita ng mga listahang may mataas na pagganap na may virtualization ng mga elemento. Hindi tulad ng ScrollView, ang FlatList ay nagre-render lamang ng mga nakikitang elemento ng screen, nakakatipid ng memorya at processor. Sinusuportahan ng bahagi ang pahalang at patayong pag-scroll, pull-to-refresh at walang katapusang pag-load. Magbasa pa tungkol sa arkitektura ng listahan sa dokumentasyon ng Meta.

Mga pangunahing punto

  • FlatList — isang naka-virtualize na bahagi ng listahan na nagre-render lamang ng mga nakikitang elemento at muling ginagamit ang mga ito habang nag-i-scroll
  • Pagganap ay nakakamit sa pamamagitan ng windowing rendering — ang mga elemento sa labas ng screen ay hindi nililikha
  • API ay kinabibilangan ng renderItem, keyExtractor, ItemSeparatorComponent, ListHeaderComponent at ListFooterComponent
  • Pahalang na mga listahan ay naka-configure sa pamamagitan ng horizontal flag at nagbabago ng direksyon ng pag-scroll sa X axis
  • Pag-optimize ay nangangailangan ng tamang pag-configure ng keyExtractor, useMemo para sa data at getItemLayout para sa mga nakapirming laki

Ano ang FlatList?

FlatList — isang bahagi ng React Native na nagpapatupad ng naka-virtualize na listahan na may mahusay na pag-render ng malalaking dami ng data. Ang bahagi ay binuo sa ibabaw ng VirtualizedList at nagbibigay ng deklaratibong API para sa paglikha ng mga flat na listahan ng anumang pagiging kumplikado.

Ang FlatList ay lumitaw sa React Native 0.43 bilang kapalit ng lumang ListView. Ayon sa data ng Meta (2026), ang FlatList ay ginagamit sa 85% ng mga application ng React Native na nagtatrabaho sa mga listahan. Sinusuportahan ng bahagi ang lahat ng karaniwang sitwasyon: mga contact, news feed, katalogo ng produkto, chat.

Kasaysayan at lugar sa ecosystem

Bago ang pagdating ng FlatList, ang mga developer ay gumagamit ng ListView na nangangailangan ng manu-manong pag-configure ng muling paggamit ng cell. Awtomatiko ng FlatList ang prosesong ito sa pamamagitan ng pagpapakilala ng windowing rendering katulad ng RecyclerView sa Android (2014) at UICollectionView sa iOS (2012). Sa mga modernong proyekto, ang FlatList ay ang de facto na pamantayan para sa lahat ng listahan.

Paano gumagana ang virtualization ng FlatList

Virtualization ng FlatList — mekanismo kung saan ang bahagi ay nagre-render lamang ng mga elemento na nasa nakikitang lugar ng screen, kasama ang maliit na buffer sa bawat panig. Ang natitirang mga elemento ay hindi nililikha sa DOM, nakakatipid ng memorya at nagpapabilis ng pag-render.

Sa pag-scroll, muling ginagamit ng FlatList ang mga nagawa nang View cell sa pamamagitan ng pagpapalit ng data sa loob ng mga ito. Pinipigilan nito ang paglikha ng libu-libong View para sa isang listahan ng 10,000 elemento. Ang default na laki ng buffer ay 10 elemento sa itaas at ibaba ng nakikitang lugar, ngunit maaaring i-configure sa pamamagitan ng windowSize.

ParameterDefaultPaglalarawan
windowSize21Bilang ng mga pahina para sa pag-render (1 pahina = taas ng screen)
initialNumToRender10Bilang ng mga elemento sa unang pag-render
maxToRenderPerBatch10Maximum na elemento na nire-render sa isang batch
removeClippedSubviewsfalsePag-alis ng View sa labas ng screen mula sa hierarchy

Ang pinakamainam na pag-configure ng mga parameter na ito ay nagbibigay-daan sa pagbalanse sa pagitan ng kinis ng pag-scroll at paggamit ng memorya. Para sa mga listahan na may malalaking elemento, inirerekomenda na bawasan ang windowSize sa 5-7.

API at pangunahing props ng FlatList

FlatList API ay may kasamang hanay ng mga props para sa pag-configure ng hitsura at pag-uugali ng listahan. Dalawang mandatoryong props — data (array ng data) at renderItem (function ng pag-render ng elemento). Pinapataas ng keyExtractor ang pagganap sa pamamagitan ng pagbibigay ng natatanging susi para sa bawat elemento.

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 ay nagdaragdag ng separator sa pagitan ng mga elemento, ListHeaderComponent at ListFooterComponent — header at footer ng listahan. Ito ay nagbibigay-daan sa paglikha ng mga kumplikadong layout nang walang karagdagang wrapper.

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

Pag-optimize ng pagganap ng FlatList

Pag-optimize ng FlatList ay kritikal para sa mga application na may daan-daan at libu-libong elemento. Kung walang tamang pag-configure, ang listahan ay maaaring bumagal sa pag-scroll, kumonsumo ng labis na memorya at magdulot ng pag-crash sa mahihinang device.

Unang panuntunan — gumamit ng keyExtractor na may natatangi at matatag na mga identifier. Ang mga index bilang mga susi ay humahantong sa maling muling paggamit ng cell at mga bug sa estado. Pangalawa — balutin ang renderItem sa useCallback at gamitin ang React.memo para sa bahagi ng elemento.

getItemLayout para sa nakapirming taas

Kung ang lahat ng elemento ay may parehong taas, pinapayagan ng getItemLayout ang FlatList na kalkulahin ang posisyon ng pag-scroll nang hindi sinusukat ang mga bahagi. Ito ay nagbibigay ng makabuluhang pagtaas sa pagganap, lalo na kapag nag-i-scroll sa isang partikular na 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 para sa data ay pumipigil sa mga hindi kinakailangang re-render. Kung ang data ay nagmula sa API, baguhin ito nang isang beses at i-cache. Gamitin ang React.memo para sa bahagi ng elemento upang maiwasan ang pag-render ng mga hindi nabagong elemento.

Pahalang na mga listahan at carousel

Pahalang na FlatList ay nilikha sa pamamagitan ng pagdaragdag ng prop na horizontal={true}. Binabago ng listahan ang direksyon ng pag-scroll sa X axis, na maginhawa para sa mga carousel ng produkto, gallery ng larawan at pahalang na menu.

Sa pahalang na mode, mahalaga na i-configure nang tama ang snapToInterval at snapToAlignment para sa sunud-sunod na pag-scroll, tulad ng sa native na mga carousel. Awtomatikong pinangangasiwaan ng bahagi ang momentum at pagbitaw ng daliri, humihinto sa pinakamalapit na elemento.

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 na tinatawag kapag nagbago ang mga nakikitang elemento. Ginagamit para sa analytics, lazy loading ng mga larawan at pag-activate ng video para lamang sa mga nakikitang card.

Pull-to-refresh at walang katapusang pag-load

Pull-to-refresh sa FlatList ay ipinapatupad sa pamamagitan ng props na refreshing at onRefresh, na nagtutulungan sa estado ng pag-load. Kapag hinila ang listahan pababa, ang onRefresh ay tinatawag, at ang refreshing flag ay humaharang sa mga paulit-ulit na tawag.

Walang katapusang pag-load (infinite scroll) ay naka-configure sa pamamagitan ng onEndReached — callback na na-trigger kapag papalapit sa dulo ng listahan. Tinutukoy ng onEndReachedThreshold kung ilang elemento bago ang dulo ang magti-trigger ng kaganapan. Para sa pagination karaniwang ginagamit ang cursor-based approach.

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

Mahalaga: ang onEndReached ay maaaring tawagin nang maraming beses. Magdagdag ng isLoading flag para harangan ang mga paulit-ulit na kahilingan hanggang sa matapos ang nauna. Gamitin ang ActivityIndicator sa ListFooterComponent upang ipahiwatig ang pag-load.

Mga madalas itanong

Ano ang pagkakaiba ng FlatList sa ScrollView?

FlatList ay gumagamit ng virtualization — nagre-render lamang ng mga nakikitang elemento, nakakatipid ng memorya sa malalaking data. ScrollView ay nagre-render ng lahat ng child element nang sabay-sabay, angkop lamang para sa maliliit na listahan hanggang 20-30 elemento. Ang FlatList ay optimal para sa 100+ elemento.

Paano ayusin ang pagkutitap (flash) kapag nag-a-update ng data ng FlatList?

Ang pagkutitap ay nangyayari kapag nagbago ang reference ng data array. Gamitin ang extraData sa pamamagitan ng pagpapasa ng dependency doon, o balutin ang renderItem sa React.memo. Para sa ganap na kontrol, ilapat ang useMemo para patatagin ang mga reference ng data.

Bakit hindi nag-i-scroll ang FlatList sa loob ng ibang scroll-view?

FlatList ay hindi dinisenyo para ilagay sa loob ng ScrollView dahil sa conflict ng gesture. Mga solusyon: gamitin ang FlatList na may nestedScrollEnabled (Android), SectionList para sa mga seksyon, o ilipat ang panlabas na pag-scroll sa FlatList sa pamamagitan ng ListHeaderComponent.

Paano i-animate ang paglitaw ng mga elemento ng FlatList?

Gamitin ang Animated API sa loob ng renderItem na may pagkaantala batay sa index. Sa pag-scroll, ilapat ang onViewableItemsChanged para mag-trigger ng animation. Ang mga library na react-native-reanimated at react-native-lottie ay nagpapasimple sa paglikha ng mga kumplikadong animation ng paglitaw.

Ano ang VirtualizedList at paano ito nauugnay sa FlatList?

VirtualizedList — ang pangunahing bahagi ng virtualization kung saan binuo ang FlatList at SectionList. Ang FlatList ay isang wrapper ng VirtualizedList na may pinasimpleng API para sa mga flat na listahan. Ang VirtualizedList ay nagbibigay ng mas mababang antas ng kontrol, ngunit bihirang gamitin nang direkta.

Buod

  • FlatList — ang pangunahing bahagi ng React Native para sa mga listahang may mataas na pagganap na may awtomatikong virtualization at muling paggamit ng cell
  • Virtualization ay nagre-render lamang ng mga nakikitang elemento sa pamamagitan ng windowSize at initialNumToRender, nakakatipid ng memorya sa malalaking set ng data
  • Mandatoryong props: data, renderItem at keyExtractor — tiyakin ang tamang paggana ng listahan
  • getItemLayout ay nagpapabilis ng pag-scroll para sa mga elementong may nakapirming taas, inaalis ang dynamic na pagsukat
  • Pahalang na mga listahan at carousel ay naka-configure sa pamamagitan ng horizontal at snapToInterval para sa sunud-sunod na pag-scroll
  • Pull-to-refresh at onEndReached ay nagpapatupad ng walang katapusang pag-load na may proteksyon laban sa mga paulit-ulit na tawag
  • React.memo at useCallback ay mandatory para sa renderItem — kung wala ang mga ito, bawat pag-scroll ay nagdudulot ng muling pag-render ng lahat ng elemento

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din