SectionList: mi ez, szekciók struktúrája és API React Native-ban

Szerző: IT Sectr Megjelenés: 2026-07-05 Olvasási idő: 10 perc

SectionList — React Native komponens szekcionált listák megjelenítésére az elemek kategóriánkénti csoportosításával. A FlatList-tel ellentétben a SectionList címeket és adatokat tartalmazó szekciók tömbjét fogadja, ami lehetővé teszi alfabetikus indexek, katalógusok és menük létrehozását. A komponens támogatja a sticky headers-t — rögzített címeket görgetés közben. A listák API-járól bővebben a Meta hivatalos útmutatójában olvashat.

Főbb pontok

  • SectionList — komponens elemek szekciókba csoportosítására címekkel, a VirtualizedList-re építve
  • Adatstruktúra szekciók tömbjéből áll, mindegyik tartalmaz egy title és egy data tömböt
  • Sticky headers rögzítik a szekciók címeit a képernyő tetejéhez görgetés közben
  • Teljesítmény örökli a FlatList virtualizációs mechanizmusait — ablakos megjelenítés és cellák újrafelhasználása
  • SectionSeparatorComponent lehetővé teszi a szekciók közötti elválasztók beállítását az elemek elválasztóitól függetlenül

Mi az a SectionList?

SectionList — React Native komponens logikai szekciókba csoportosított adatok megjelenítésére. Minden szekciónak van egy címe és elemlistája, ami ideális az ábécé szerinti kapcsolatokhoz, kategóriánkénti menükhöz, dátum szerinti rendelésekhez. A komponens a VirtualizedList-re épül és örökli a virtualizáció összes előnyét.

A SectionList a FlatList-tel együtt jelent meg a React Native 0.43-ban, és azóta a kategorizált listák szabványa. A Meta adatai szerint (2026) a React Native projektek 40%-a használja a SectionList-et strukturált adatok rendezésére. A FlatList-en belüli kézi csoportosítással ellentétben a SectionList beépített támogatást nyújt a szekciókhoz.

Fő használati forgatókönyvek

SectionList alkalmazása kapcsolati listákban alfabetikus indexszel, ahol minden betű külön szekció. Az e-kereskedelemben a komponens termékeket csoportosít kategória vagy márka szerint. Jegyzetalkalmazásokban — dátum vagy címkék szerint. Beállításokban — szekciónként (Alapvető, Biztonság, Értesítések).

A React Native használatának kutatása szerint (Meta, 2026) a SectionList 5–50 szekcióval és szekciónként 3–20 elemmel a leghatékonyabb. Kevesebb szekció esetén egyszerűbb a FlatList használata csoportosítással a ListHeaderComponent-en keresztül. Több szekció esetén — teljesítményproblémák merülnek fel a nagyszámú cím miatt.

Adatstruktúra és szekciók

SectionList Data Section objektumok tömbjét fogadja, amelyek mindegyike tartalmaz egy title-t (szekció címe) és egy data-t (elemek tömbje). Ezenkívül minden szekcióhoz külön átadható key és renderItem, felülírva az általános renderItem-et.

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

renderSectionHeader — a szekció címének megjelenítő függvénye, amely megkapja a szekció objektumot. renderItem — az elem megjelenítő függvénye, hasonló a FlatList-hez. A komponens támogatja a renderSectionFooter-t is minden szekció alsó részéhez.

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 és navigáció a szekciók között

Sticky headers — a SectionList legfontosabb jellemzője. Amikor a felhasználó görget, az aktuális szekció címe a képernyő felső széléhez tapad, amíg a szekció teljesen el nem görül. Ez állandó kontextust biztosít a felhasználó számára az aktuális kategóriáról.

A sticky mód alapértelmezés szerint be van kapcsolva. Kikapcsolásához használja a stickySectionHeadersEnabled={false} beállítást. iOS-en a címek natív animációval tapadnak, Androidon — JS-en keresztül. Alfabetikus névjegyzékekhez kényelmes oldalsávot hozzáadni betűkkel a gyors navigációhoz.

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 — metódus programozott navigációhoz bármely szekcióba. Elfogadja a sectionIndex, itemIndex és viewPosition értékeket (0 — eleje, 0.5 — közepe, 1 — vége). Az oldalsó alfabetikus indexszel kombinálva gyors navigáció valósítható meg, mint a szabvány iOS kapcsolatokban.

A SectionList teljesítményének optimalizálása

A SectionList optimalizálása ugyanazokat az elveket követi, mint a FlatList optimalizálása, kiegészítve a szekciókkal kapcsolatos további részletekkel. Minden szekciócím egy további View, amely megjelenítésre és újramegjelenítésre kerül görgetés közben. 50+ szekciónál a címek lassíthatják a görgetést.

Használja a React.memo-t a renderSectionHeader és renderItem számára a szükségtelen újramegjelenítések elkerüléséhez. Ha a szekciók nem változnak dinamikusan, fontolja meg a useMemo használatát a sections tömb számára. Nagyon nagy listák esetén kombinálja a SectionList-et a getItemLayout-tal, megadva a címek és elemek rögzített magasságát.

Optimalizációs technikaLeírásHatás
React.memoCím és elem komponensek memoizálásaCsökkenti az újramegjelenítések számát görgetés közben
getItemLayoutCím + elem rögzített magasságaEltávolítja a mérést, gyorsítja a görgetést indexre
maxToRenderPerBatchElemek korlátozása kötegbenMegakadályozza a késődéseket gyors görgetésnél
windowSizeCsökkentés 5–10-re nagy listáknálCsökkenti az egyidejűleg megjelenített elemek számát

SectionList vs FlatList: mikor mit válasszon

A választás a SectionList és a FlatList között az adatstruktúrától függ. Ha az adatok lapos tömböt képeznek — használja a FlatList-et. Ha az adatok természetesen kategóriákba csoportosulnak címekkel — SectionList. Ne használja a SectionList-et egyetlen szekcióhoz — a FlatList hatékonyabb lesz.

A teljesítménykülönbség minimális azonos elemszám esetén. A SectionList többletterhelést ad a címek megjelenítéséhez, de ez a többletterhelés akkor indokolt, ha a címek jelentéssel bírnak. Ha nincs szükség címekre — a FlatList ListHeaderComponent-tel a szekciók szimulálásához gyorsabb lesz.

Választási kritériumok

Használja a SectionList-et, amikor: az adatok alapértelmezés szerint csoportosítottak (kapcsolatok betű szerint), sticky headers szükségesek, a szekciócímek interaktív elemeket tartalmaznak (gombok, jelölőnégyzetek). Használja a FlatList-et, amikor: az adatok laposak, a csoportosítás dinamikusan változik, a kategóriák száma több mint 50 és a címek egységesek.

SectionList implementációs példák

SectionList alfabetikus indexszel — klasszikus használati példa. Az implementáció tartalmaz egy oldalsávot betűkkel és scrollToLocation-t a szekcióhoz ugráshoz. Alább a kapcsolati lista teljes implementációja alfabetikus navigációval.

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

Fontos: a szekciók dinamikus szűrésekor használja a useMemo-t a tömb stabilizálásához. Memoizálás nélkül a SectionList minden szűrőváltozáskor újra létrehozza az összes cellát, ami a görgetés és a beágyazott komponensek állapotának elvesztéséhez vezet.

Gyakran Ismételt Kérdések

Használható a SectionList dinamikus szekciókkal?

Igen, a SectionList támogatja a szekciók dinamikus változtatását. A sections tömb megváltozásakor a komponens csak a megváltozott szekciókat jeleníti meg újra. Stabil működéshez használjon key-t minden szekcióhoz, és csomagolja a komponenseket React.memo-ba.

Hogyan rejthetem el az ürüs szekciókat a SectionList-ben?

Szűrje a sections tömböt átadás előtt: távolítsa el az ürüs data-val rendelkező szekciókat. Ha az adatok API-ból érkeznek, végezze el a szűrést a useMemo-ban. A teljes lista ürüs állapotához használja a ListEmptyComponent-et.

Miért nem működnek a sticky headers Androidon?

A Sticky headers Androidon alapértelmezés szerint be vannak kapcsolva, de ütközés esetén a nestedScrollEnabled-del nem működhetnek. Győződjön meg róla, hogy a SectionList nincs ScrollView-ba ágyazva. Android 12+-ban a sticky headers natív mechanizmuson keresztül működnek, régebbi verziókban — JS-en keresztül.

Hogyan szabhatom testre a sticky header váltásának animációját?

A SectionList nem nyújt beépített animációt a sticky header váltásához. Egyedi animációhoz kövesse az onViewableItemsChanged eseményt, és animálja a cím változását az Animated API-n vagy a react-native-reanimated-on keresztül.

Befolyásolják a többlet szekciók a SectionList teljesítményét?

Igen, minden szekció hozzáad egy címet a DOM-hoz. 100+ szekciónál a SectionList teljesítménye csökken a nagyszámú cím miatt. Megoldás: csoportosítsa az adatokat 10–20 logikai szekcióba, vagy használja a FlatList-et egyedi csoportosítással.

Összefoglaló

  • SectionList — React Native komponens adatok szekciókba csoportosított megjelenítésére címekkel és sticky headers-szel
  • Szekcióstruktúra title-ből (cím) és data-ból (elemek tömbje) áll, átadva a sections prop-on keresztül
  • Sticky headers rögzítik az aktuális szekció címét görgetés közben, javítva a navigációt hosszú listákban
  • Optimalizálás React.memo-t igényel a címekhez, useMemo-t a szekciókhoz és getItemLayout-t a rögzített magassághoz
  • scrollToLocation programozott navigációt biztosít bármely szekcióhoz index alapján
  • SectionList vs FlatList: SectionList kategorizált adatokhoz címekkel, FlatList lapos tömbökhöz
  • Alfabetikus index a SectionList-tel kombinálódik a scrollToLocation-on keresztül gyors betű szerinti navigációhoz

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is