Το στοιχείο ScrollView στο React Native — ένα container με δυνατότητα κύλισης περιεχομένου που υπερβαίνει τις διαστάσεις της οθόνης. Σε αντίθεση με το FlatList, το ScrollView κάνει render όλο το περιεχόμενο ταυτόχρονα, κάτι που είναι βέλτιστο για μικρές ποσότητες δεδομένων, φόρμες και οθόνες με γνωστό ύψος. Σύμφωνα με το React Native Docs, 2024, το ScrollView υποστηρίζει κάθετη και οριζόντια κύλιση, το συμβάν onScroll, προγραμματικό έλεγχο θέσης και χειρονομίες ζουμ. Το στοιχείο κάνει render ως εγγενές UIScrollView στο iOS και ScrollView στο Android.
Κύρια σημεία
ScrollView — είναι ένα στοιχείο React Native που περιβάλλει το περιεχόμενό του σε ένα scrollable container. Εάν το περιεχόμενο υπερβαίνει τα όρια της οθόνης, ο χρήστης μπορεί να το κυλήσει κάθετα ή οριζόντια. Το ScrollView κάνει render όλα τα θυγατρικά στοιχεία κατά την τοποθέτηση, ανεξάρτητα από το αν είναι ορατά στην οθόνη ή όχι.
Σε αντίθεση με το FlatList, το οποίο κάνει render μόνο τα ορατά στοιχεία (lazy rendering), το ScrollView δημιουργεί όλες τις εγγενείς αναπαραστάσεις ταυτόχρονα. Αυτό καθιστά το ScrollView βολικό για φόρμες, σελίδες ρυθμίσεων, κάρτες προϊόντων σε μία οθόνη — παντού όπου ο αριθμός των θυγατρικών στοιχείων είναι μικρός (έως 20-30) ή ο ακριβής αριθμός τους δεν είναι γνωστός εκ των προτέρων.
Σύμφωνα με το React Native Using ScrollView, 2024, το ScrollView υποστηρίζει ένθετη κύλιση (π.χ. ScrollView μέσα σε ScrollView), εφέ αναπήδησης κατά την επίτευξη του άκρου, δείκτες κύλισης, ασφάλιση θέσης (snap) και διαχείριση χειρονομιών. Στο iOS, το ScrollView προσθέτει αυτόματα κενό κάτω από το SafeArea μέσω του contentInsetAdjustmentBehavior.
ScrollView παρέχει ένα πλούσιο σύνολο ιδιοτήτων για τον έλεγχο της συμπεριφοράς κύλισης, της εμφάνισης και της διαδραστικότητας. Ας εξετάσουμε τις βασικές ομάδες: έλεγχος κύλισης, οπτικές ρυθμίσεις, συμβάντα και χαρακτηριστικά πλατφόρμας.
horizontal — αλλάζει την κατεύθυνση κύλισης από κάθετη (προεπιλογή) σε οριζόντια. scrollEnabled — απενεργοποιεί την κύλιση αν χρειαστεί. showsVerticalScrollIndicator και showsHorizontalScrollIndicator ελέγχουν την εμφάνιση των δεικτών κύλισης. bounces (iOS) ενεργοποιεί/απενεργοποιεί το εφέ αναπήδησης κατά την επίτευξη του άκρου του περιεχομένου.
Το κύριο συμβάν — onScroll, το οποίο καλείται σε κάθε κύλιση και μεταδίδει ένα αντικείμενο με nativeEvent που περιέχει contentOffset (τρέχουσα θέση), contentSize (μέγεθος περιεχομένου), layoutMeasurement (μέγεθος ορατής περιοχής). onMomentumScrollEnd καλείται μετά την ολοκλήρωση της αδρανειακής κύλισης. onScrollEndDrag — όταν ο χρήστης απελευθέρωσε την οθόνη. Αυτά τα συμβάντα χρησιμοποιούνται για την υλοποίηση ατέρμονης κύλισης, παράλλαξης και lazy loading.
Το ScrollView παρέχει μεθόδους για προγραμματικό έλεγχο μέσω αναφοράς: scrollTo({x, y, animated}) κυλάει στις καθορισμένες συντεταγμένες, scrollToEnd({animated}) — στο τέλος του περιεχομένου, flashScrollIndicators() — εμφανίζει προσωρινά τους δείκτες κύλισης.
const scrollRef = useRef(null);
// Κύλιση στην κορυφή
scrollRef.current.scrollTo({ x: 0, y: 0, animated: true });
// Κύλιση στο τέλος
scrollRef.current.scrollToEnd({ animated: true });
Ο προγραμματικός έλεγχος κύλισης χρησιμοποιείται συχνά σε συνομιλίες (αυτόματη κύλιση στο τελευταίο μήνυμα), φόρμες (κύλιση στο πεδίο με σφάλμα) και καρουζέλ (προγραμματική κύλιση).
Η επιλογή μεταξύ ScrollView και FlatList — μία από τις βασικές αρχιτεκτονικές αποφάσεις στο React Native. Και τα δύο στοιχεία παρέχουν κύλιση, αλλά χρησιμοποιούν θεμελιωδώς διαφορετικές στρατηγικές render. Το ScrollView κάνει render τα πάντα ταυτόχρονα, το FlatList — μόνο τα ορατά στοιχεία.
| Χαρακτηριστικό | ScrollView | FlatList |
|---|---|---|
| Render | Όλα τα στοιχεία ταυτόχρονα | Μόνο ορατά + buffer |
| Απόδοση | Μειώνεται σε 30+ στοιχεία | Σταθερή σε οποιαδήποτε ποσότητα |
| Περιεχόμενο | Οποιαδήποτε στοιχεία (φόρμες, κάρτες) | Ομοιογενή στοιχεία από πίνακα |
| Μέγεθος δεδομένων | Μικρό και μεσαίο (έως 30 στοιχεία) | Μεγάλο και απεριόριστο |
| Οριζόντια κύλιση | Ναι (ιδιότητα horizontal) | Ναι (horizontal) |
| Ενότητες | Όχι (κάνει render ως έχει) | SectionList για ενότητες |
Κανόνας επιλογής: ScrollView — για οθόνες όπου ο αριθμός θυγατρικών στοιχείων είναι γνωστός και δεν υπερβαίνει τα 20-30 (προφίλ χρήστη, φόρμα ρυθμίσεων, σελίδα προϊόντος). FlatList — για λίστες με δυνητικά μεγάλο αριθμό στοιχείων (ροή ειδήσεων, κατάλογος προϊόντων, μηνύματα συνομιλίας). Εάν το περιεχόμενο είναι ετερογενές (τίτλος, φόρμα, κάρτα, υποσέλιδο) — το ScrollView είναι προτιμότερο, καθώς το FlatList αναμένει ομοιογενή στοιχεία.
ScrollView υποστηρίζει οριζόντια κύλιση μέσω της ιδιότητας horizontal, καθιστώντας το ιδανικό για καρουζέλ, γκαλερί εικόνων, καρτέλες και οριζόντιες λίστες. Σε συνδυασμό με την ιδιότητα pagingEnabled (iOS) ή snapToInterval, το ScrollView μετατρέπεται σε στοιχείο για πλοήγηση σελίδων.
Η ιδιότητα horizontal αλλάζει την κατεύθυνση κύλισης. Το pagingEnabled (iOS) ενεργοποιεί την κύλιση σελίδας, όπου η κύλιση σταματά μόνο στα όρια των στοιχείων. snapToInterval ορίζει το βήμα ασφάλισης σε pixel και για τις δύο πλατφόρμες.
const ImageCarousel = ({ images }) => (
<ScrollView
horizontal
pagingEnabled
showsHorizontalScrollIndicator={false}
onMomentumScrollEnd={handlePageChange}
>
{images.map((img, index) => (
<Image
key={index}
source={{ uri: img }}
style={{ width: SCREEN_WIDTH, height: 250 }}
/>
))}
</ScrollView>
);
Σε αυτό το καρουζέλ, το pagingEnabled ασφαλίζει αυτόματα την κύλιση στα όρια κάθε εικόνας. onMomentumScrollEnd επιτρέπει την ενημέρωση του δείκτη της τρέχουσας σελίδας. Ένα τέτοιο καρουζέλ λειτουργεί εγγενώς και υποστηρίζει αδρανειακή κύλιση.
Για προσαρμοσμένα βήματα ασφάλισης χρησιμοποιείται snapToInterval (μέγεθος βήματος σε pixel) και snapToAlignment (start, center, end). Μέσω του snapToOffsets μπορεί να οριστεί ένας πίνακας συγκεκριμένων θέσεων για ασφάλιση. Αυτό είναι χρήσιμο για οριζόντιες λίστες με κάρτες διαφορετικών μεγεθών.
Ας εξετάσουμε δύο τυπικά σενάρια: οθόνη με φόρμα (κάθετη κύλιση) και οριζόντια λίστα κατηγοριών. Και τα δύο χρησιμοποιούν ScrollView με διαφορετικές ιδιότητες για βέλτιστη συμπεριφορά.
Η σελίδα επεξεργασίας προφίλ περιέχει ετερογενή στοιχεία: avatar, πολλά πεδία εισόδου, διακόπτες και κουμπί αποθήκευσης. Το ScrollView επιτρέπει την κύλιση ολόκληρης της σελίδας στο σύνολό της, όχι κάθε μπλοκ ξεχωριστά.
const ProfileScreen = () => (
<ScrollView
contentContainerStyle={styles.container}
keyboardShouldPersistTaps="handled"
showsVerticalScrollIndicator={false}
>
<AvatarPicker />
<TextInput placeholder="Name" />
<TextInput placeholder="Email" />
<TextInput placeholder="About me" multiline />
<SwitchRow label="Notifications" />
<Button title="Save" />
</ScrollView>
);
Η ιδιότητα keyboardShouldPersistTaps: 'handled' επιτρέπει την κύλιση και την αλληλεπίδραση με τη φόρμα όταν το πληκτρολόγιο είναι ανοιχτό. Το contentContainerStyle εφαρμόζει περιθώρια σε όλο το περιεχόμενο. Αυτό το μοτίβο χρησιμοποιείται σε όλες τις οθόνες με φόρμες στο React Native.
Για πλοήγηση σε κατηγορίες (συνομιλίες, φίλτρα, καρτέλες) χρησιμοποιείται οριζόντιο ScrollView με chips. Ένα τέτοιο στοιχείο συναντάται συχνά σε εφαρμογές marketplace και κοινωνικών δικτύων.
const CategoryChips = ({ categories, selected, onSelect }) => (
<ScrollView
horizontal
showsHorizontalScrollIndicator={false}
contentContainerStyle={styles.chipContainer}
>
{categories.map((cat) => (
<Chip
key={cat.id}
label={cat.name}
isSelected={selected === cat.id}
onPress={() => onSelect(cat.id)}
/>
))}
</ScrollView>
);
Οριζόντιο ScrollView με απενεργοποιημένο δείκτη — πρότυπο για τη γραμμή κατηγοριών. Κάθε chip είναι ένα ξεχωριστό στοιχείο με κατάσταση επιλογής. Η ιδιότητα showsHorizontalScrollIndicator: false κρύβει τη γραμμή κύλισης, που ανταποκρίνεται στις προσδοκίες των χρηστών εφαρμογών για κινητά.
Συχνές ερωτήσεις
Το ScrollView είναι κατάλληλο για μικρές ποσότητες δεδομένων (έως 20-30 στοιχεία) και ετερογενές περιεχόμενο (φόρμες, προφίλ, οθόνες ρυθμίσεων). Επιλέξτε το FlatList για μεγάλες ομοιογενείς λίστες — ροή ειδήσεων, κατάλογος προϊόντων, μηνύματα.
Χρησιμοποιήστε το συμβάν onScroll με onScrollEndDrag ή onMomentumScrollEnd. Στο nativeEvent.contentOffset.y περιέχεται η τρέχουσα κάθετη θέση. Για απόδοση, χρησιμοποιήστε ScrollEventThrottle (iOS) για ρύθμιση της συχνότητας κλήσης του onScroll.
Το ScrollView κάνει render όλα τα στοιχεία κατά την τοποθέτηση, δημιουργώντας εγγενείς αναπαραστάσεις για το καθένα. Με 50+ στοιχεία στην οθόνη, το φορτίο μνήμης και του νήματος JS αυξάνεται, προκαλώντας πτώση καρέ. Για τέτοιες περιπτώσεις, χρησιμοποιήστε FlatList με lazy rendering.
Ορίστε bounces={false}. Αυτή η ιδιότητα λειτουργεί μόνο στο iOS και απενεργοποιεί το εφέ ελατηρίου κατά την επίτευξη του άκρου του ScrollView. Στο Android, το εφέ αναπήδησης δεν υπάρχει από προεπιλογή, επομένως η ιδιότητα αγνοείται.
Το ScrollView δεν υποστηρίζει ατέρμονη κύλιση εγγενώς. Ωστόσο, μπορείτε να συνδυάσετε το onScroll με έλεγχο προσέγγισης στο κάτω άκρο (contentOffset.y + ύψος οθόνης >= contentSize.height) και να προσθέτετε στοιχεία στο state. Για σοβαρές ποσότητες δεδομένων, χρησιμοποιήστε FlatList με onEndReached.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης