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 χρησιμοποιείται σε λίστες επαφών με αλφαβητικό ευρετήριο, όπου κάθε γράμμα είναι μια ξεχωριστή ενότητα. Στο ηλεκτρονικό εμπόριο, το στοιχείο ομαδοποιεί προϊόντα ανά κατηγορία ή μάρκα. Σε εφαρμογές σημειώσεων — ανά ημερομηνία ή ετικέτες. Στις ρυθμίσεις — ανά ενότητες (Βασικά, Ασφάλεια, Ειδοποιήσεις).

Σύμφωνα με την έρευνα χρήσης 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 προσθέτει επιβάρυνση στην απόδοση των τίτλων, αλλά αυτή η επιβάρυνση είναι δικαιολογημένη όταν οι τίτλοι έχουν νόημα. Εάν δεν χρειάζονται τίτλοι — το FlatList με ListHeaderComponent για προσομοίωση ενοτήτων θα είναι ταχύτερο.

Κριτήρια επιλογής

Χρησιμοποιήστε SectionList όταν: τα δεδομένα είναι ομαδοποιημένα από προεπιλογή (επαφές κατά γράμμα), χρειάζονται sticky headers, οι τίτλοι ενοτήτων περιέχουν διαδραστικά στοιχεία (κουμπιά, πλαίσια ελέγχου). Χρησιμοποιήστε 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. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης