SectionList: шта је то, структура секција и API у React Native

Аутор: IT Sectr Објављено: 2026-07-05 Време читања: 10 мин

SectionList — компонента React Native за приказ секционисаних листа са груписањем елемената по категоријама. За разлику од FlatList, SectionList прима низ секција са заглављима и подацима, што омогућава стварање абецедних индекса, каталога и менија. Компонента подржава sticky headers — закачена заглавља при скроловању. Више о API листа прочитајте у званичном водичу Meta.

Главно

  • SectionList — компонента за груписање елемената у секције са заглављима, изграђена на VirtualizedList
  • Структура података се састоји од низа секција, свака садржи title и низ data
  • Sticky headers закачују заглавља секција при скроловању
  • Перформансе наслеђује механизме виртуелизације FlatList — прозорско рендеровање и поновну употребу ћелија
  • SectionSeparatorComponent омогућава подешавање раздвајача између секција независно од раздвајача елемената

Шта је SectionList?

SectionList — компонента React Native за приказ података груписаних у логичке секције. Свака секција има заглавље и листу елемената, што је идеално за контакте по абецеди, меније по категоријама, поруџбине по датумима. Компонента је изграђена на VirtualizedList и наслеђује све предности виртуелизације.

SectionList се појавио заједно са FlatList у React Native 0.43 и од тада је стандард за категоризоване листе. Према Meta подацима (2026), 40% пројеката на React Native користи SectionList за организовање структурираних података. За разлику од ручног груписања унутар FlatList, SectionList пружа уграђену подршку за секције.

Основни сценарији употребе

SectionList се примењује у контакт листама са абецедним индексом, где је свако слово посебна секција. У e-commerce компонента групише производе по категоријама или брендовима. У апликацијама за белешке — по датумима или ознакама. У подешавањима — по секцијама (Основно, Безбедност, Обавештења).

Према истраживању употребе React Native (Meta, 2026), SectionList је најефикаснији при 5–50 секција са 3–20 елемената у свакој. При мањем броју секција једноставније је користити FlatList са груписањем преко ListHeaderComponent. При већем — јављају се проблеми са перформансама због великог броја заглавља.

Структура података и секције

SectionList Data прима низ Section објеката, од којих сваки садржи title (заглавље секције) и data (низ елемената). Додатно, могу се преносити key и renderItem за сваку секцију посебно, замењујући општи renderItem.

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

renderSectionHeader — функција рендеровања заглавља секције, која прима објекат секције. renderItem — функција рендеровања елемента, аналогна FlatList. Компонента такође подржава renderSectionFooter за доњи део сваке секције.

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 и навигација по секцијама

Sticky headers — кључна карактеристика SectionList. Када корисник скролује, заглавље тренутне секције се лепи за горњу ивицу екрана док се секција потпуно не скролује. Ово пружа кориснику сталан контекст о тренутној категорији.

Sticky режим је подразумевано укључен. За искључивање користите stickySectionHeadersEnabled={false}. На iOS заглавља се лепе са изворном анимацијом, на Android-у — преко JS. За абецедне именике згодно је додати бочни панел са словима за брзу навигацију.

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 — метод за програмску навигацију до било које секције. Прима sectionIndex, itemIndex и viewPosition (0 — почетак, 0.5 — центар, 1 — крај). Комбинујући са бочним абецедним индексом, може се имплементирати брза навигација као у стандардним iOS контактима.

Оптимизација перформанси SectionList

Оптимизација SectionList следи исте принципе као оптимизација FlatList, са додатним нијансама везаним за секције. Свако заглавље секције је додатни View који се рендерује и поново рендерује при скроловању. При 50+ секција заглавља могу успорити скроловање.

Користите React.memo за renderSectionHeader и renderItem да бисте избегли непотребна поновна рендеровања. Ако се секције не мењају динамички, размотрите useMemo за низ sections. За веома велике листе комбинујте SectionList са getItemLayout, наводећи фиксну висину заглавља и елемената.

Техника оптимизацијеОписЕфекат
React.memoМемоизација компоненти заглавља и елеменатаСмањује број поновних рендеровања при скроловању
getItemLayoutФиксна висина заглавља + елементаУклања мерење, убрзава скроловање до индекса
maxToRenderPerBatchОграничење елемената у групиСпречава кашњења при брзом скроловању
windowSizeСмањење на 5–10 за велике листеСмањује број истовремено рендерованих елемената

SectionList vs FlatList: када шта изабрати

Избор између SectionList и FlatList зависи од структуре података. Ако подаци представљају равни низ — користите FlatList. Ако се подаци природно групишу у категорије са заглављима — SectionList. Немојте користити SectionList за једну секцију — FlatList ће бити ефикаснији.

Разлика у перформансама је минимална при истом броју елемената. SectionList додаје overhead на рендеровање заглавља, али је овај overhead оправдан када заглавља носе значај. Ако заглавља нису потребна — FlatList са ListHeaderComponent за имитацију секција биће бржи.

Критеријуми избора

Користите SectionList када: подаци су подразумевано груписани (контакти по словима), потребни су sticky headers, заглавља секција садрже интерактивне елементе (дугмад, checkbox). Користите FlatList када: подаци су равни, груписање се мења динамички, категорија има више од 50 и заглавља су истоветна.

Примери имплементације SectionList

SectionList са абецедним индексом — класичан пример употребе. Имплементација укључује бочни панел са словима и scrollToLocation за скок до секције. Испод је потпуна имплементација контакт листе са абецедном навигацијом.

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

Важно: при динамичком филтрирању секција користите useMemo за стабилизацију низа. Без мемоизације SectionList ће поново стварати све ћелије при свакој промени филтера, што доводи до губитка скроловања и стања угњеждених компоненти.

Често постављана питања

Може ли се SectionList користити са динамичким секцијама?

Да, SectionList подржава динамичке измене секција. При промени низа sections компонента поново рендерује само измењене секције. За стабилан рад користите key за сваку секцију и умотавајте компоненте у React.memo.

Како сакрити празне секције у SectionList?

Филтрирајте низ sections пре прослеђивања: уклоните секције са празним data. Ако подаци долазе из API-ја, обављајте филтрирање у useMemo. За празно стање целе листе користите ListEmptyComponent.

Зашто sticky headers не раде на Android-у?

Sticky headers на Android-у су подразумевано укључени, али могу да не раде приликом конфликта са nestedScrollEnabled. Уверите се да SectionList није угњежден у ScrollView. На Android 12+ sticky headers раде преко изворног механизма, на старијим верзијама — преко JS.

Како прилагодити анимацију промене sticky header-а?

SectionList не пружа уграђену анимацију промене sticky header-а. За прилагођену анимацију пратите onViewableItemsChanged и анимирајте промену заглавља кроз Animated API или react-native-reanimated.

Да ли додатне секције утичу на перформансе SectionList?

Да, свака секција додаје заглавље у DOM. При 100+ секција перформансе SectionList опадају због великог броја заглавља. Решење: групишите податке у 10–20 логичких секција или користите FlatList са прилагођеним груписањем.

Резиме

  • SectionList — компонента React Native за приказ података груписаних у секције са заглављима и sticky headers
  • Структура секција се састоји од title (заглавље) и data (низ елемената), прослеђених кроз prop sections
  • Sticky headers закачују заглавље тренутне секције при скроловању, побољшавајући навигацију у дугим листама
  • Оптимизација захтева React.memo за заглавља, useMemo за секције и getItemLayout за фиксну висину
  • scrollToLocation обезбеђује програмску навигацију до било које секције по индексу
  • SectionList vs FlatList: SectionList за категоризоване податке са заглављима, FlatList за равне низове
  • Абецедни индекс се комбинује са SectionList кроз scrollToLocation за брзу навигацију по словима

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође