SectionList: ano ito, istraktura ng seksyon at API sa React Native

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

SectionList — React Native component para sa pagpapakita ng mga naka-seksyong listahan na may pag-grupo ng mga elemento ayon sa kategorya. Hindi tulad ng FlatList, ang SectionList ay tumatanggap ng array ng mga seksyon na may mga heading at data, na nagbibigay-daan sa paglikha ng mga alpabetikong index, katalogo at menu. Sinusuportahan ng component ang sticky headers — mga naka-pin na heading habang nag-i-scroll. Para sa higit pang impormasyon tungkol sa API ng mga listahan, basahin ang opisyal na gabay ng Meta.

Mga Pangunahing Punto

  • SectionList — component para sa pag-grupo ng mga elemento sa mga seksyon na may mga heading, na binuo sa ibabaw ng VirtualizedList
  • Istraktura ng data ay binubuo ng array ng mga seksyon, bawat isa ay naglalaman ng title at array ng data
  • Sticky headers ay nagpi-pin ng mga heading ng seksyon sa itaas na bahagi ng screen habang nag-i-scroll
  • Pagganap ay nagmamana ng mga mekanismo ng virtualisasyon ng FlatList — window rendering at muling paggamit ng mga cell
  • SectionSeparatorComponent ay nagbibigay-daan sa pag-configure ng mga separator sa pagitan ng mga seksyon nang hiwalay sa mga separator ng elemento

Ano ang SectionList?

SectionList — React Native component para sa pagpapakita ng data na naka-grupo sa mga lohikal na seksyon. Bawat seksyon ay may heading at listahan ng mga elemento, mainam para sa mga contact ayon sa alpabeto, mga menu ayon sa kategorya, mga order ayon sa petsa. Ang component ay binuo sa ibabaw ng VirtualizedList at nagmamana ng lahat ng mga bentahe ng virtualisasyon.

Ang SectionList ay lumitaw kasama ng FlatList sa React Native 0.43 at mula noon ay naging pamantayan para sa mga naka-kategoryang listahan. Ayon sa data ng Meta (2026), 40% ng mga proyekto sa React Native ay gumagamit ng SectionList para sa pag-oorganisa ng naka-istrukturang data. Hindi tulad ng manu-manong pag-grupo sa loob ng FlatList, ang SectionList ay nagbibigay ng built-in na suporta para sa mga seksyon.

Pangunahing mga sitwasyon ng paggamit

SectionList ay ginagamit sa mga listahan ng contact na may alpabetikong index, kung saan ang bawat letra ay hiwalay na seksyon. Sa e-commerce, ang component ay nag-grupo ng mga produkto ayon sa kategorya o brand. Sa mga note-taking app — ayon sa petsa o tags. Sa mga setting — ayon sa seksyon (Basic, Seguridad, Mga Notipikasyon).

Ayon sa pananaliksik ng paggamit ng React Native (Meta, 2026), ang SectionList ay pinaka-epektibo sa 5–50 seksyon na may 3–20 elemento bawat isa. Sa mas kaunting bilang ng mga seksyon, mas madaling gamitin ang FlatList na may pag-grupo sa pamamagitan ng ListHeaderComponent. Sa mas maraming seksyon — lumilitaw ang mga problema sa pagganap dahil sa malaking bilang ng mga heading.

Istraktura ng data at mga seksyon

SectionList Data ay tumatanggap ng array ng mga Section object, bawat isa ay naglalaman ng title (heading ng seksyon) at data (array ng mga elemento). Bukod pa rito, maaaring magpasa ng key at renderItem para sa bawat seksyon nang hiwalay, na nag-o-override sa pangkalahatang renderItem.

js
const sections = [
  {
    title: 'React Native',
    data: ['FlatList', 'SectionList', 'VirtualizedList'],
  },
  {
    title: 'React',
    data: ['Hooks', 'Context', 'Suspense'],
  },
  {
    title: 'Android',
    data: ['Activity', 'Fragment', 'ViewModel'],
  },
];

renderSectionHeader — function ng rendering ng heading ng seksyon na tumatanggap ng object ng seksyon. renderItem — function ng rendering ng elemento, katulad ng FlatList. Sinusuportahan din ng component ang renderSectionFooter para sa ibabang bahagi ng bawat seksyon.

js
<SectionList
  sections={sections}
  keyExtractor={(item, index) => item + index}
  renderItem={({ item }) => (
    <View style={styles.item}>
      <Text>{item}</Text>
    </View>
  )}
  renderSectionHeader={({ section }) => (
    <View style={styles.sectionHeader}>
      <Text style={styles.sectionTitle}>{section.title}</Text>
    </View>
  )}
/>

Sticky headers at nabigasyon sa mga seksyon

Sticky headers — pangunahing tampok ng SectionList. Kapag nag-i-scroll ang user, ang heading ng kasalukuyang seksyon ay dumidikit sa itaas na gilid ng screen hanggang sa ganap na ma-scroll ang seksyon. Ito ay nagbibigay sa user ng patuloy na konteksto tungkol sa kasalukuyang kategorya.

Ang sticky mode ay naka-enable bilang default. Para i-disable, gamitin ang stickySectionHeadersEnabled={false}. Sa iOS, ang mga heading ay dumidikit na may native na animation, sa Android — sa pamamagitan ng JS. Para sa mga alpabetikong sanggunian, maginhawang magdagdag ng side panel na may mga letra para sa mabilis na nabigasyon.

js
const ContactsList = () => {
  const sectionListRef = React.useRef(null);

  const scrollToSection = (index) => {
    sectionListRef.current?.scrollToLocation({
      sectionIndex: index,
      itemIndex: 0,
      viewPosition: 0,
    });
  };

  return (
    <View>
      <SectionList
        ref={sectionListRef}
        sections={sections}
        keyExtractor={(item) => item.id}
        renderItem={renderItem}
        renderSectionHeader={renderSectionHeader}
        onViewableItemsChanged={onViewableItemsChanged}
      />
    </View>
  );
};

scrollToLocation — paraan para sa programmatic na nabigasyon sa anumang seksyon. Tumatanggap ng sectionIndex, itemIndex at viewPosition (0 — simula, 0.5 — gitna, 1 — dulo). Sa pamamagitan ng pagsasama nito sa alpabetikong side index, maaaring ipatupad ang mabilis na nabigasyon tulad ng sa karaniwang iOS contacts.

Pag-optimize ng pagganap ng SectionList

Pag-optimize ng SectionList ay sumusunod sa parehong mga prinsipyo ng pag-optimize ng FlatList, na may mga karagdagang nuances na may kaugnayan sa mga seksyon. Bawat heading ng seksyon ay karagdagang View na nire-render at nire-render muli habang nag-i-scroll. Sa 50+ seksyon, ang mga heading ay maaaring magpabagal ng pag-scroll.

Gamitin ang React.memo para sa renderSectionHeader at renderItem upang maiwasan ang hindi kinakailangang pag-re-render. Kung ang mga seksyon ay hindi nagbabago nang dynamic, isaalang-alang ang useMemo para sa array ng sections. Para sa napakalaking listahan, pagsamahin ang SectionList sa getItemLayout, na tumutukoy ng nakapirming taas ng mga heading at elemento.

Teknik ng pag-optimizePaglalarawanEpekto
React.memoMemoization ng mga component ng heading at elementoBinabawasan ang bilang ng pag-re-render habang nag-i-scroll
getItemLayoutNakapirming taas ng heading + elementoTinatanggal ang pagsukat, pinapabilis ang pag-scroll sa index
maxToRenderPerBatchLimitasyon ng mga elemento sa batchPinipigilan ang mga pagkaantala sa mabilis na pag-scroll
windowSizePagbawas sa 5–10 para sa malalaking listahanBinabawasan ang bilang ng sabay-sabay na nire-render na elemento

SectionList vs FlatList: kailan pipiliin ang alin

Ang pagpili sa pagitan ng SectionList at FlatList ay depende sa istraktura ng data. Kung ang data ay flat array — gamitin ang FlatList. Kung ang data ay natural na nag-grupo sa mga kategorya na may mga heading — SectionList. Huwag gumamit ng SectionList para sa isang seksyon — ang FlatList ay magiging mas mahusay.

Ang pagkakaiba sa pagganap ay minimal sa parehong bilang ng mga elemento. Ang SectionList ay nagdaragdag ng overhead sa rendering ng mga heading, ngunit ang overhead na ito ay makatwiran kapag ang mga heading ay may kahulugan. Kung hindi kailangan ang mga heading — ang FlatList na may ListHeaderComponent para sa simulation ng mga seksyon ay magiging mas mabilis.

Mga pamantayan sa pagpili

Gamitin ang SectionList kapag: ang data ay naka-grupo bilang default (mga contact ayon sa letra), kailangan ang sticky headers, ang mga heading ng seksyon ay naglalaman ng mga interactive na elemento (mga button, checkbox). Gamitin ang FlatList kapag: ang data ay flat, ang pag-grupo ay nagbabago nang dynamic, ang bilang ng mga kategorya ay higit sa 50 at ang mga heading ay pare-pareho.

Mga halimbawa ng implementasyon ng SectionList

SectionList na may alpabetikong index — klasikong halimbawa ng paggamit. Ang implementasyon ay may kasamang side panel na may mga letra at scrollToLocation para tumalon sa seksyon. Sa ibaba ay ang kumpletong implementasyon ng contact list na may alpabetikong nabigasyon.

js
const ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');

const AlphabetContacts = () => {
  const ref = React.useRef(null);

  const sections = React.useMemo(() =>
    ALPHABET.map(letter => ({
      title: letter,
      data: contacts.filter(c => c.name.startsWith(letter)),
    })).filter(s => s.data.length > 0),
  []);

  return (
    <View style={styles.container}>
      <SectionList
        ref={ref}
        sections={sections}
        keyExtractor={item => item.id}
        renderItem={renderContact}
        renderSectionHeader={renderHeader}
        getItemLayout={getItemLayout}
      />
      <View style={styles.sidebar}>
        {ALPHABET.map(letter => (
          <Text
            key={letter}
            onPress={() => scrollToSection(letter)}
          >{letter}</Text>
        ))}
      </View>
    </View>
  );
};

Mahalaga: sa dynamic na pag-filter ng mga seksyon, gamitin ang useMemo para sa pag-stabilize ng array. Kung walang memoization, ang SectionList ay muling lilikha ng lahat ng cell sa bawat pagbabago ng filter, na humahantong sa pagkawala ng pag-scroll at estado ng mga nested component.

Mga Madalas Itanong

Maaari bang gamitin ang SectionList sa mga dynamic na seksyon?

Oo, SectionList ay sumusuporta sa dynamic na pagbabago ng mga seksyon. Kapag nagbago ang array ng sections, ang component ay nagre-render lamang ng mga binagong seksyon. Para sa matatag na operasyon, gumamit ng key para sa bawat seksyon at balutin ang mga component sa React.memo.

Paano itago ang mga walang laman na seksyon sa SectionList?

I-filter ang array ng sections bago ipasa: alisin ang mga seksyon na may walang laman na data. Kung ang data ay mula sa API, gawin ang pag-filter sa useMemo. Para sa walang laman na estado ng buong listahan, gamitin ang ListEmptyComponent.

Bakit hindi gumagana ang sticky headers sa Android?

Ang Sticky headers sa Android ay naka-enable bilang default, ngunit maaaring hindi gumana kapag nagka-konflikt sa nestedScrollEnabled. Tiyakin na ang SectionList ay hindi naka-nest sa ScrollView. Sa Android 12+, ang sticky headers ay gumagana sa pamamagitan ng native na mekanismo, sa mas lumang bersyon — sa pamamagitan ng JS.

Paano i-customize ang animation ng paglipat ng sticky header?

Ang SectionList ay hindi nagbibigay ng built-in na animation para sa paglipat ng sticky header. Para sa custom na animation, subaybayan ang onViewableItemsChanged at i-animate ang pagbabago ng heading sa pamamagitan ng Animated API o react-native-reanimated.

Nakakaapekto ba ang mga karagdagang seksyon sa pagganap ng SectionList?

Oo, bawat seksyon ay nagdaragdag ng heading sa DOM. Sa 100+ seksyon, bumababa ang pagganap ng SectionList dahil sa malaking bilang ng mga heading. Solusyon: grupo ang data sa 10–20 lohikal na seksyon o gumamit ng FlatList na may custom na pag-grupo.

Buod

  • SectionList — React Native component para sa pagpapakita ng data na naka-grupo sa mga seksyon na may mga heading at sticky headers
  • Istraktura ng seksyon ay binubuo ng title (heading) at data (array ng mga elemento), na ipinapasa sa pamamagitan ng prop sections
  • Sticky headers ay nagpi-pin ng heading ng kasalukuyang seksyon habang nag-i-scroll, pinapabuti ang nabigasyon sa mahabang listahan
  • Pag-optimize ay nangangailangan ng React.memo para sa mga heading, useMemo para sa mga seksyon at getItemLayout para sa nakapirming taas
  • scrollToLocation ay nagbibigay ng programmatic na nabigasyon sa anumang seksyon ayon sa index
  • SectionList vs FlatList: SectionList para sa naka-kategoryang data na may mga heading, FlatList para sa flat arrays
  • Alpabetikong index ay pinagsama sa SectionList sa pamamagitan ng scrollToLocation para sa mabilis na nabigasyon ayon sa letra

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