De ScrollView-component in React Native — een container met de mogelijkheid om inhoud te scrollen die de schermafmetingen overschrijdt. In tegenstelling tot FlatList, rendert ScrollView alle inhoud in één keer, wat optimaal is voor kleine hoeveelheden gegevens, formulieren en schermen met bekende hoogte. Volgens React Native Docs, 2024 ondersteunt ScrollView verticaal en horizontaal scrollen, de onScroll-gebeurtenis, programmatische positiecontrole en zoomgebaren. De component wordt gerenderd als native UIScrollView op iOS en ScrollView op Android.
Belangrijkste punten
ScrollView — is een React Native-component die zijn inhoud in een scrollbare container plaatst. Als de inhoud buiten de schermgrenzen valt, kan de gebruiker deze verticaal of horizontaal scrollen. ScrollView rendert alle onderliggende elementen bij het monteren, ongeacht of ze zichtbaar zijn op het scherm of niet.
In tegenstelling tot FlatList, dat alleen zichtbare elementen rendert (lazy rendering), maakt ScrollView alle native weergaven in één keer aan. Dit maakt ScrollView handig voor formulieren, instellingenpagina's, productkaarten op één scherm — overal waar het aantal onderliggende elementen klein is (tot 20-30) of het exacte aantal niet van tevoren bekend is.
Volgens React Native Using ScrollView, 2024 ondersteunt ScrollView genest scrollen (bijv. ScrollView binnen ScrollView), het bounce-effect bij het bereiken van de rand, scrollindicatoren, positievergrendeling (snap) en gebarenbediening. Op iOS voegt ScrollView automatisch ruimte onder SafeArea toe via contentInsetAdjustmentBehavior.
ScrollView biedt een uitgebreide set eigenschappen voor het beheren van scrollgedrag, uiterlijk en interactiviteit. Laten we de belangrijkste groepen bekijken: scrollbeheer, visuele instellingen, gebeurtenissen en platformkenmerken.
horizontal — schakelt de scrollrichting van verticaal (standaard) naar horizontaal. scrollEnabled — schakelt scrollen uit indien nodig. showsVerticalScrollIndicator en showsHorizontalScrollIndicator beheren de weergave van scrollindicatoren. bounces (iOS) schakelt het bounce-effect in/uit bij het bereiken van de rand van de inhoud.
De belangrijkste gebeurtenis — onScroll, die bij elke scroll wordt aangeroepen en een object met nativeEvent doorgeeft, met contentOffset (huidige positie), contentSize (grootte van de inhoud), layoutMeasurement (grootte van het zichtbare gebied). onMomentumScrollEnd wordt aangeroepen na het beëindigen van inertieel scrollen. onScrollEndDrag — wanneer de gebruiker het scherm loslaat. Deze gebeurtenissen worden gebruikt voor het implementeren van oneindig scrollen, parallax en lazy loading.
ScrollView biedt methoden voor programmatisch beheer via een referentie: scrollTo({x, y, animated}) scrollt naar opgegeven coördinaten, scrollToEnd({animated}) — naar het einde van de inhoud, flashScrollIndicators() — toont tijdelijk de scrollindicatoren.
const scrollRef = useRef(null);
// Scroll naar boven
scrollRef.current.scrollTo({ x: 0, y: 0, animated: true });
// Scroll naar einde
scrollRef.current.scrollToEnd({ animated: true });
Programmatisch scrollbeheer wordt vaak gebruikt in chats (autoscrollen naar het laatste bericht), formulieren (scrollen naar het veld met een fout) en carrousels (programmatisch scrollen).
De keuze tussen ScrollView en FlatList — een van de belangrijkste architecturale beslissingen in React Native. Beide componenten bieden scrollen, maar gebruiken fundamenteel verschillende renderingstrategieën. ScrollView rendert alles in één keer, FlatList — alleen zichtbare elementen.
| Kenmerk | ScrollView | FlatList |
|---|---|---|
| Rendering | Alle elementen in één keer | Alleen zichtbare + buffer |
| Prestaties | Neemt af bij 30+ elementen | Stabiel bij elke hoeveelheid |
| Inhoud | Elke componenten (formulieren, kaarten) | Homogene elementen uit array |
| Gegevensgrootte | Klein en middelgroot (tot 30 elementen) | Groot en onbeperkt |
| Horizontaal scrollen | Ja (eigenschap horizontal) | Ja (horizontal) |
| Secties | Nee (rendert zoals het is) | SectionList voor secties |
Kiesregel: ScrollView — voor schermen waar het aantal onderliggende elementen bekend is en niet meer dan 20-30 bedraagt (gebruikersprofiel, instellingenformulier, productpagina). FlatList — voor lijsten met potentieel veel elementen (nieuwsfeed, productencatalogus, chatberichten). Als de inhoud heterogeen is (titel, formulier, kaart, footer) — heeft ScrollView de voorkeur, omdat FlatList homogene elementen verwacht.
ScrollView ondersteunt horizontaal scrollen via de eigenschap horizontal, wat het ideaal maakt voor carrousels, afbeeldingsgalerijen, tabbladen en horizontale lijsten. In combinatie met de eigenschap pagingEnabled (iOS) of snapToInterval wordt ScrollView een component voor paginanavigatie.
De eigenschap horizontal schakelt de scrollrichting om. pagingEnabled (iOS) schakelt paginerend scrollen in, waarbij scrollen alleen stopt op de grenzen van elementen. snapToInterval stelt de snapstap in pixels in voor beide platforms.
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>
);
In deze carrousel koppelt pagingEnabled automatisch het scrollen aan de grenzen van elke afbeelding. onMomentumScrollEnd maakt het mogelijk de indicator van de huidige pagina bij te werken. Zo'n carrousel werkt native en ondersteunt inertieel scrollen.
Voor aangepaste snapstappen wordt snapToInterval (stapgrootte in pixels) en snapToAlignment (start, center, end) gebruikt. Met snapToOffsets kan een array van specifieke posities voor snapping worden ingesteld. Dit is handig voor horizontale lijsten met kaarten van verschillende grootte.
Laten we twee typische scenario's bekijken: een scherm met een formulier (verticaal scrollen) en een horizontale categorielijst. Beide gebruiken ScrollView met verschillende eigenschappen voor optimaal gedrag.
De profielbewerkingspagina bevat heterogene elementen: avatar, meerdere invoervelden, schakelaars en een opslagknop. ScrollView maakt het mogelijk de hele pagina in zijn geheel te scrollen, niet elk blok afzonderlijk.
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>
);
De eigenschap keyboardShouldPersistTaps: 'handled' maakt scrollen en interactie met het formulier mogelijk wanneer het toetsenbord open is. contentContainerStyle past marges toe op de hele inhoud. Dit patroon wordt gebruikt in alle schermen met formulieren in React Native.
Voor navigatie door categorieën (chats, filters, tabbladen) wordt een horizontale ScrollView met chips gebruikt. Zo'n component komt vaak voor in marktplaats- en sociale netwerkapps.
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>
);
Horizontale ScrollView met uitgeschakelde indicator — de standaard voor de categoriebalk. Elke chip is een aparte component met een selectiestatus. De eigenschap showsHorizontalScrollIndicator: false verbergt de scrollbalk, wat overeenkomt met de verwachtingen van mobiele app-gebruikers.
Veelgestelde vragen
ScrollView is geschikt voor kleine hoeveelheden gegevens (tot 20-30 elementen) en heterogene inhoud (formulieren, profielen, instellingenschermen). Kies FlatList voor lange homogene lijsten — nieuwsfeed, productencatalogus, berichten.
Gebruik de onScroll-gebeurtenis met onScrollEndDrag of onMomentumScrollEnd. In nativeEvent.contentOffset.y staat de huidige verticale positie. Gebruik voor prestaties ScrollEventThrottle (iOS) om de frequentie van onScroll-aanroepen in te stellen.
ScrollView rendert alle elementen bij het monteren en maakt voor elk native weergaven aan. Bij 50+ elementen op het scherm neemt de belasting van het geheugen en de JS-thread toe, wat frameverlies veroorzaakt. Gebruik in dergelijke gevallen FlatList met lazy rendering.
Stel bounces={false} in. Deze eigenschap werkt alleen op iOS en schakelt het verende effect bij het bereiken van de rand van ScrollView uit. Op Android is het bounce-effect standaard niet aanwezig, dus wordt de eigenschap genegeerd.
ScrollView ondersteunt native geen oneindig scrollen. Je kunt echter onScroll combineren met het controleren van de nabijheid van de onderrand (contentOffset.y + schermhoogte >= contentSize.height) en elementen toevoegen aan de state. Gebruik voor serieuze hoeveelheden gegevens FlatList met onEndReached.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook