SectionList — componentă React Native pentru afișarea listelor secționate cu gruparea elementelor pe categorii. Spre deosebire de FlatList, SectionList primește un tablou de secțiuni cu titluri și date, ceea ce permite crearea indicilor alfabetici, cataloagelor și meniurilor. Componenta acceptă sticky headers — titluri fixate în timpul derulării. Pentru mai multe detalii despre API-ul listelor, citiți ghidul oficial Meta.
Principalele
SectionList — componentă React Native pentru afișarea datelor grupate în secțiuni logice. Fiecare secțiune are un titlu și o listă de elemente, ideală pentru contacte alfabetic, meniuri pe categorii, comenzi pe date. Componenta este construită pe VirtualizedList și moștenește toate avantajele virtualizării.
SectionList a apărut odată cu FlatList în React Native 0.43 și de atunci este standardul pentru liste categorisite. Conform datelor Meta (2026), 40% din proiectele React Native folosesc SectionList pentru organizarea datelor structurate. Spre deosebire de gruparea manuală în FlatList, SectionList oferă suport încorporat pentru secțiuni.
SectionList este utilizat în liste de contacte cu indice alfabetic, unde fiecare literă este o secțiune separată. În e-commerce, componenta grupează produsele pe categorii sau mărci. În aplicațiile de notițe — pe date sau etichete. În setări — pe secțiuni (De bază, Securitate, Notificări).
Conform cercetării utilizării React Native (Meta, 2026), SectionList este cel mai eficient la 5–50 de secțiuni cu 3–20 de elemente fiecare. La un număr mai mic de secțiuni, este mai simplu să folosiți FlatList cu grupare prin ListHeaderComponent. La un număr mai mare — apar probleme de performanță din cauza numărului mare de titluri.
SectionList Data primește un tablou de obiecte Section, fiecare conținând title (titlul secțiunii) și data (tablou de elemente). În plus, se pot transmite key și renderItem pentru fiecare secțiune separat, suprascriind renderItem-ul general.
const sections = [
{
title: 'React Native',
data: ['FlatList', 'SectionList', 'VirtualizedList'],
},
{
title: 'React',
data: ['Hooks', 'Context', 'Suspense'],
},
{
title: 'Android',
data: ['Activity', 'Fragment', 'ViewModel'],
},
];renderSectionHeader — funcția de randare a titlului secțiunii, care primește obiectul secțiunii. renderItem — funcția de randare a elementului, analogă cu FlatList. Componenta acceptă de asemenea renderSectionFooter pentru partea inferioară a fiecărei secțiuni.
<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 — caracteristica cheie a SectionList. Când utilizatorul derulează, titlul secțiunii curente se fixează la marginea superioară a ecranului până când secțiunea este derulată complet. Aceasta oferă utilizatorului un context constant despre categoria curentă.
Modul sticky este activat implicit. Pentru dezactivare, utilizați stickySectionHeadersEnabled={false}. Pe iOS, titlurile se fixează cu animație nativă, pe Android — prin JS. Pentru ghiduri alfabetice, este convenabil să adăugați un panou lateral cu litere pentru navigare rapidă.
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 — metodă pentru navigarea programatică la orice secțiune. Acceptă sectionIndex, itemIndex și viewPosition (0 — început, 0.5 — centru, 1 — sfârșit). Combinând cu indicele alfabetic lateral, se poate implementa navigarea rapidă ca în contactele standard iOS.
Optimizarea SectionList urmează aceleași principii ca optimizarea FlatList, cu nuanțe suplimentare legate de secțiuni. Fiecare titlu de secțiune este un View suplimentar care se randeează și se re-randeează în timpul derulării. La 50+ secțiuni, titlurile pot încetini derularea.
Utilizați React.memo pentru renderSectionHeader și renderItem pentru a evita re-randările inutile. Dacă secțiunile nu se schimbă dinamic, luați în considerare useMemo pentru tabloul sections. Pentru liste foarte mari, combinați SectionList cu getItemLayout, specificând înălțimea fixă a titlurilor și elementelor.
| Tehnica de optimizare | Descriere | Efect |
|---|---|---|
| React.memo | Memoizarea componentelor de titluri și elemente | Reduce numărul de re-randări în timpul derulării |
| getItemLayout | Înălțime fixă a titlului + elementului | Elimină măsurarea, accelerează derularea la index |
| maxToRenderPerBatch | Limitarea elementelor în lot | Previne întârzierile la derularea rapidă |
| windowSize | Reducerea la 5–10 pentru liste mari | Reduce numărul de elemente randate simultan |
Alegerea între SectionList și FlatList depinde de structura datelor. Dacă datele sunt un tablou plat — utilizați FlatList. Dacă datele se grupează natural în categorii cu titluri — SectionList. Nu utilizați SectionList pentru o singură secțiune — FlatList va fi mai eficient.
Diferența de performanță este minimă la același număr de elemente. SectionList adaugă un overhead pentru randarea titlurilor, dar acest overhead este justificat când titlurile au încărcătură semantică. Dacă titlurile nu sunt necesare — FlatList cu ListHeaderComponent pentru simularea secțiunilor va fi mai rapid.
Utilizați SectionList când: datele sunt grupate implicit (contacte pe litere), sunt necesare sticky headers, titlurile secțiunilor conțin elemente interactive (butoane, checkboxuri). Utilizați FlatList când: datele sunt plate, gruparea se schimbă dinamic, numărul de categorii depășește 50 și titlurile sunt uniforme.
SectionList cu indice alfabetic — exemplu clasic de utilizare. Implementarea include un panou lateral cu litere și scrollToLocation pentru saltul la secțiune. Mai jos este implementarea completă a unei liste de contacte cu navigare alfabetică.
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>
);
};Important: la filtrarea dinamică a secțiunilor, utilizați useMemo pentru stabilizarea tabloului. Fără memoizare, SectionList va recrea toate celulele la fiecare modificare a filtrului, ceea ce duce la pierderea derulării și a stării componentelor încuibate.
Întrebări frecvente
Da, SectionList acceptă modificări dinamice ale secțiunilor. La schimbarea tabloului sections, componenta re-randeează doar secțiunile modificate. Pentru funcționare stabilă, utilizați key pentru fiecare secțiune și înfășurați componentele în React.memo.
Filtrați tabloul sections înainte de transmitere: eliminați secțiunile cu data gol. Dacă datele vin de la API, efectuați filtrarea în useMemo. Pentru starea goală a întregii liste, utilizați ListEmptyComponent.
Sticky headers pe Android sunt activate implicit, dar pot să nu funcționeze în caz de conflict cu nestedScrollEnabled. Asigurați-vă că SectionList nu este încuibat în ScrollView. Pe Android 12+, sticky headers funcționează prin mecanismul nativ, pe versiunile mai vechi — prin JS.
SectionList nu oferă animație încorporată pentru schimbarea sticky header. Pentru animație personalizată, urmăriți onViewableItemsChanged și animați schimbarea titlului prin Animated API sau react-native-reanimated.
Da, fiecare secțiune adaugă un titlu în DOM. La 100+ secțiuni, performanța SectionList scade din cauza numărului mare de titluri. Soluție: grupați datele în 10–20 secțiuni logice sau utilizați FlatList cu grupare personalizată.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și