SectionList: nima, bo'limlar tuzilishi va API React Native'da

Muallif: IT Sectr Nashr etilgan: 2026-07-05 O'qish vaqti: 10 daq

SectionList — React Native komponenti bo‘limlarga ajratilgan ro‘yxatlarni elementlarni kategoriyalar bo‘yicha guruhlash bilan ko‘rsatish uchun. FlatList-dan farqli o‘laroq, SectionList sarlavhalar va ma’lumotlar bilan bo‘limlar massivini qabul qiladi, bu alifbo ko‘rsatkichlari, kataloglar va menyular yaratish imkonini beradi. Komponent sticky headers — aylantirish paytida sarlavhalarni mahkamlashni qo‘llab-quvvatlaydi. Ro‘yxat API-lari haqida batafsil ma’lumot uchun Meta-ning rasmiy qo‘llanmasiga qarang.

Asosiy

  • SectionList — elementlarni sarlavhalar bilan bo‘limlarda guruhlash uchun komponent, VirtualizedList asosida qurilgan
  • Ma’lumotlar tuzilishi bo‘limlar massividan iborat, har biri title va data massivini o‘z ichiga oladi
  • Sticky headers aylantirish paytida bo‘lim sarlavhalarini ekranning yuqori chetiga mahkamlaydi
  • Unumdorlik FlatList virtualizatsiya mexanizmlarini meros qilib oladi — oyna renderi va hujayralarni qayta ishlatish
  • SectionSeparatorComponent bo‘limlar orasidagi ajratgichlarni element ajratgichlaridan mustaqil ravishda sozlash imkonini beradi

SectionList nima?

SectionList — ma’lumotlarni mantiqiy bo‘limlarda guruhlangan holda ko‘rsatish uchun React Native komponenti. Har bir bo‘lim sarlavha va elementlar ro‘yxatiga ega, bu alifbo bo‘yicha kontaktlar, kategoriyalar bo‘yicha menyular, sanalar bo‘yicha buyurtmalar uchun idealdir. Komponent VirtualizedList asosida qurilgan va virtualizatsiyaning barcha afzalliklarini meros qilib oladi.

SectionList FlatList bilan birga React Native 0.43 da paydo bo‘ldi va shu vaqtdan beri kategoriyalashtirilgan ro‘yxatlar uchun standart hisoblanadi. Meta ma’lumotlariga ko‘ra (2026), React Native loyihalarining 40% i tuzilgan ma’lumotlarni tashkil qilish uchun SectionList dan foydalanadi. FlatList ichida qo‘lda guruhlashdan farqli o‘laroq, SectionList bo‘limlarning ichki qo‘llab-quvvatlanishini ta’minlaydi.

Asosiy foydalanish stsenariylari

SectionList alifbo ko‘rsatkichiga ega kontakt ro‘yxatlarida qo‘llaniladi, bu yerda har bir harf alohida bo‘limdir. E-commerce-da komponent mahsulotlarni kategoriyalar yoki brendlar bo‘yicha guruhlaydi. Eslatma ilovalarida — sanalar yoki teglar bo‘yicha. Sozlamalarda — bo‘limlar bo‘yicha (Asosiy, Xavfsizlik, Bildirishnomalar).

React Native foydalanish tadqiqotiga ko‘ra (Meta, 2026), SectionList har birida 3–20 element bo‘lgan 5–50 bo‘limda eng samarali hisoblanadi. Kamroq bo‘limlar sonida ListHeaderComponent orqali guruhlash bilan FlatList dan foydalanish osonroq. Ko‘proq bo‘limlarda — ko‘p sonli sarlavhalar tufayli unumdorlik muammolari yuzaga keladi.

Ma’lumotlar tuzilishi va bo‘limlar

SectionList Data har biri title (bo‘lim sarlavhasi) va data (elementlar massivi) ni o‘z ichiga olgan Section obyektlari massivini qabul qiladi. Qo‘shimcha ravishda, har bir bo‘lim uchun alohida key va renderItem uzatilishi mumkin, umumiy renderItem ni bekor qilgan holda.

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

renderSectionHeader — bo‘lim obyektini qabul qiluvchi bo‘lim sarlavhasi render funksiyasi. renderItem — FlatList-ga o‘xshash element render funksiyasi. Komponent har bir bo‘limning pastki qismi uchun renderSectionFooter ni ham qo‘llab-quvvatlaydi.

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 va bo‘limlar bo‘yicha navigatsiya

Sticky headers — SectionList ning asosiy xususiyati. Foydalanuvchi aylantirganda, joriy bo‘limning sarlavhasi ekranning yuqori chetiga yopishadi, bo‘lim to‘liq aylantirilgunga qadar. Bu foydalanuvchiga joriy kategoriya haqida doimiy kontekst beradi.

Sticky rejimi sukut bo‘yicha yoqilgan. O‘chirish uchun stickySectionHeadersEnabled={false} dan foydalaning. iOS da sarlavhalar native animatsiya bilan yopishadi, Android da — JS orqali. Alifbo ma’lumotnomalari uchun tez navigatsiya uchun harflar bilan yon panel qo‘shish qulay.

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 — istalgan bo‘limga dasturiy navigatsiya uchun metod. sectionIndex, itemIndex va viewPosition (0 — boshlanish, 0.5 — markaz, 1 — oxir) ni qabul qiladi. Yon alifbo indeksi bilan birlashtirib, iOS standart kontaktlaridagi kabi tez navigatsiya amalga oshirilishi mumkin.

SectionList unumdorligini optimallashtirish

SectionList optimallashtirish FlatList optimallashtirish bilan bir xil tamoyillarga asoslanadi, bo‘limlar bilan bog‘liq qo‘shimcha nuanslar bilan. Har bir bo‘lim sarlavhasi aylantirish paytida render va qayta render qilinadigan qo‘shimcha View dir. 50+ bo‘limda sarlavhalar aylantirishni sekinlashtirishi mumkin.

Keraksiz qayta renderlarning oldini olish uchun renderSectionHeader va renderItem uchun React.memo dan foydalaning. Bo‘limlar dinamik o‘zgarmasa, sections massivi uchun useMemo ni ko‘rib chiqing. Juda katta ro‘yxatlar uchun SectionList ni getItemLayout bilan birlashtiring, sarlavhalar va elementlarning qat’iy balandligini ko‘rsating.

Optimallashtirish usuliTavsifTa’sir
React.memoSarlavha va element komponentlarini memizatsiyalashAylantirish paytida qayta renderlar sonini kamaytiradi
getItemLayoutSarlavha + elementning qat’iy balandligiO‘lchashni olib tashlaydi, indeksga aylantirishni tezlashtiradi
maxToRenderPerBatchPartiyadagi elementlar chekloviTez aylantirishda kechikishlarning oldini oladi
windowSizeKatta ro‘yxatlar uchun 5–10 ga kamaytirishBir vaqtda render qilinadigan elementlar sonini kamaytiradi

SectionList vs FlatList: qachon nimani tanlash

SectionList va FlatList o‘rtasidagi tanlov ma’lumotlar tuzilishiga bog‘liq. Ma’lumotlar tekis massiv bo‘lsa — FlatList dan foydalaning. Ma’lumotlar tabiiy ravishda sarlavhalar bilan kategoriyalarga guruhlansa — SectionList. Bitta bo‘lim uchun SectionList dan foydalanmang — FlatList samaraliroq bo‘ladi.

Bir xil elementlar sonida unumdorlik farqi minimal. SectionList sarlavhalarni renderlashga qo‘shimcha yuk qo‘shadi, ammo bu yuk sarlavhalar ma’no kasb etganda oqlanadi. Agar sarlavhalar kerak bo‘lmasa — bo‘limlarni simulyatsiya qilish uchun ListHeaderComponent bilan FlatList tezroq bo‘ladi.

Tanlash mezonlari

SectionList dan foydalaning, qachonki: ma’lumotlar sukut bo‘yicha guruhlangan (harflar bo‘yicha kontaktlar), sticky headers kerak bo‘lsa, bo‘lim sarlavhalari interaktiv elementlarni o‘z ichiga olsa (tugmalar, checkboxlar). FlatList dan foydalaning, qachonki: ma’lumotlar tekis, guruhlash dinamik o‘zgaradi, kategoriyalar soni 50 dan ko‘p va sarlavhalar bir xil.

SectionList implementatsiyasi misollari

SectionList alifbo ko‘rsatkichi bilan — klassik foydalanish namunasi. Implementatsiya harflar bilan yon panelni va bo‘limga sakrash uchun scrollToLocation ni o‘z ichiga oladi. Quyida alifbo navigatsiyasi bilan kontakt ro‘yxatining to‘liq implementatsiyasi keltirilgan.

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

Muhim: dinamik filtrlash paytida massivni barqarorlashtirish uchun useMemo dan foydalaning. Memizatsiyasiz SectionList har bir filtr o‘zgarishida barcha hujayralarni qayta yaratadi, bu aylantirish va ichki komponentlar holatining yo‘qolishiga olib keladi.

Tez-tez beriladigan savollar

SectionList ni dinamik bo‘limlar bilan ishlatish mumkinmi?

Ha, SectionList dinamik bo‘lim o‘zgarishlarini qo‘llab-quvvatlaydi. Sections massivi o‘zgarganda komponent faqat o‘zgargan bo‘limlarni qayta render qiladi. Barqaror ishlash uchun har bir bo‘lim uchun key dan foydalaning va komponentlarni React.memo bilan o‘rang.

SectionList da bo‘sh bo‘limlarni qanday yashirish mumkin?

Uzatishdan oldin sections massivini filtrlang: bo‘sh data ga ega bo‘limlarni olib tashlang. Ma’lumotlar API dan kelsa, filtrlashni useMemo da bajaring. Butun ro‘yxatning bo‘sh holati uchun ListEmptyComponent dan foydalaning.

Nega sticky headers Android da ishlamaydi?

Android da Sticky headers sukut bo‘yicha yoqilgan, ammo nestedScrollEnabled bilan konfliktda ishlamasligi mumkin. SectionList ScrollView ichida emasligiga ishonch hosil qiling. Android 12+ da sticky headers native mexanizm orqali ishlaydi, eski versiyalarda — JS orqali.

Sticky header o‘zgarishi animatsiyasini qanday sozlash mumkin?

SectionList ichki sticky header o‘zgarishi animatsiyasini ta’minlamaydi. Maxsus animatsiya uchun onViewableItemsChanged ni kuzating va sarlavha o‘zgarishini Animated API yoki react-native-reanimated orqali animatsiya qiling.

Qo‘shimcha bo‘limlar SectionList unumdorligiga ta’sir qiladimi?

Ha, har bir bo‘lim DOM ga sarlavha qo‘shadi. 100+ bo‘limda SectionList unumdorligi ko‘p sonli sarlavhalar tufayli pasayadi. Yechim: ma’lumotlarni 10–20 mantiqiy bo‘limga guruhlang yoki maxsus guruhlash bilan FlatList dan foydalaning.

Xulosa

  • SectionList — ma’lumotlarni sarlavhalar va sticky headers bilan bo‘limlarda ko‘rsatish uchun React Native komponenti
  • Bo‘lim tuzilishi sections prop orqali uzatiladigan title (sarlavha) va data (elementlar massivi) dan iborat
  • Sticky headers joriy bo‘lim sarlavhasini aylantirish paytida mahkamlaydi, uzun ro‘yxatlarda navigatsiyani yaxshilaydi
  • Optimallashtirish sarlavhalar uchun React.memo, bo‘limlar uchun useMemo va qat’iy balandlik uchun getItemLayout talab qiladi
  • scrollToLocation indeks bo‘yicha istalgan bo‘limga dasturiy navigatsiyani ta’minlaydi
  • SectionList vs FlatList: SectionList sarlavhalar bilan kategoriyalashtirilgan ma’lumotlar uchun, FlatList tekis massivlar uchun
  • Alifbo ko‘rsatkichi harflar bo‘yicha tez navigatsiya uchun scrollToLocation orqali SectionList bilan birlashtiriladi

Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz

IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.

Loyihani muhokama qilish

Shuningdek o'qing