Komponenten ScrollView i React Native — en behållare med möjlighet att rulla innehåll som överskrider skärmens dimensioner. Till skillnad från FlatList renderar ScrollView allt innehåll på en gång, vilket är optimalt för små mängder data, formulär och skärmar med känd höjd. Enligt React Native Docs, 2024 stöder ScrollView vertikal och horisontell rullning, onScroll-händelsen, programmatisk positionskontroll och zoomgester. Komponenten renderas som inbyggd UIScrollView på iOS och ScrollView på Android.
Huvudpunkter
ScrollView — är en React Native-komponent som omsluter sitt innehåll i en rullningsbar behållare. Om innehållet går utanför skärmens gränser kan användaren rulla det vertikalt eller horisontellt. ScrollView renderar alla underordnade element vid montering, oavsett om de är synliga på skärmen eller inte.
Till skillnad från FlatList, som endast renderar synliga element (lazy rendering), skapar ScrollView alla inbyggda representationer på en gång. Detta gör ScrollView bekvämt för formulär, inställningssidor, produktkort på en skärm — överallt där antalet underordnade element är litet (upp till 20-30) eller det exakta antalet inte är känt i förväg.
Enligt React Native Using ScrollView, 2024 stöder ScrollView nästlad rullning (t.ex. ScrollView inuti ScrollView), studseffekt vid kant, rullningsindikatorer, positionssnäppning (snap) och gesthantering. På iOS lägger ScrollView automatiskt till mellanrum under SafeArea via contentInsetAdjustmentBehavior.
ScrollView erbjuder en rik uppsättning egenskaper för att kontrollera rullningsbeteende, utseende och interaktivitet. Låt oss titta på nyckelgrupperna: rullningskontroll, visuella inställningar, händelser och plattformsfunktioner.
horizontal — växlar rullningsriktning från vertikal (standard) till horisontell. scrollEnabled — inaktiverar rullning vid behov. showsVerticalScrollIndicator och showsHorizontalScrollIndicator styr visningen av rullningsindikatorer. bounces (iOS) aktiverar/inaktiverar studseffekten vid innehållets kant.
Huvudhändelsen — onScroll, som anropas vid varje rullning och skickar ett objekt med nativeEvent som innehåller contentOffset (aktuell position), contentSize (innehållsstorlek), layoutMeasurement (storlek på synligt område). onMomentumScrollEnd anropas efter att tröghetsrullning slutförts. onScrollEndDrag — när användaren släppte skärmen. Dessa händelser används för att implementera oändlig rullning, parallax och lazy loading.
ScrollView tillhandahåller metoder för programmatisk kontroll via referens: scrollTo({x, y, animated}) rullar till angivna koordinater, scrollToEnd({animated}) — till slutet av innehållet, flashScrollIndicators() — visar tillfälligt rullningsindikatorerna.
const scrollRef = useRef(null);
// Rulla upp
scrollRef.current.scrollTo({ x: 0, y: 0, animated: true });
// Rulla till slutet
scrollRef.current.scrollToEnd({ animated: true });
Programmatisk rullningskontroll används ofta i chattar (automatisk rullning till senaste meddelandet), formulär (rullning till fältet med fel) och karuseller (programmatisk rullning).
Valet mellan ScrollView och FlatList — ett av de viktigaste arkitekturbesluten i React Native. Båda komponenterna ger rullning, men använder fundamentalt olika renderingsstrategier. ScrollView renderar allt på en gång, FlatList — endast synliga element.
| Egenskap | ScrollView | FlatList |
|---|---|---|
| Rendering | Alla element på en gång | Endast synliga + buffert |
| Prestanda | Minskar vid 30+ element | Stabil vid vilken mängd som helst |
| Innehåll | Vilka komponenter som helst (formulär, kort) | Homogena element från array |
| Datamängd | Liten och medelstor (upp till 30 element) | Stor och obegränsad |
| Horisontell rullning | Ja (egenskapen horizontal) | Ja (horizontal) |
| Sektioner | Nej (renderar som det är) | SectionList för sektioner |
Urvalsregel: ScrollView — för skärmar där antalet underordnade element är känt och inte överstiger 20-30 (användarprofil, inställningsformulär, produktsida). FlatList — för listor med potentiellt stort antal element (nyhetsflöde, produktkatalog, chattmeddelanden). Om innehållet är heterogent (rubrik, formulär, kort, sidfot) — är ScrollView att föredra eftersom FlatList förväntar sig homogena element.
ScrollView stöder horisontell rullning via egenskapen horizontal, vilket gör den idealisk för karuseller, bildgallerier, flikar och horisontella listor. I kombination med egenskapen pagingEnabled (iOS) eller snapToInterval blir ScrollView en komponent för sidnavigering.
Egenskapen horizontal växlar rullningsriktning. pagingEnabled (iOS) aktiverar sidrullning, där rullningen stannar endast vid elementens gränser. snapToInterval ställer in snäppsteget i pixlar för båda plattformarna.
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>
);
I denna karusell snäpper pagingEnabled automatiskt rullningen till varje bilds gränser. onMomentumScrollEnd gör det möjligt att uppdatera indikatorn för aktuell sida. En sådan karusell fungerar inbyggt och stöder tröghetsrullning.
För anpassade snäppsteg används snapToInterval (stegstorlek i pixlar) och snapToAlignment (start, center, end). Med snapToOffsets kan en array av specifika positioner för snäppning ställas in. Detta är användbart för horisontella listor med kort av olika storlek.
Låt oss titta på två typiska scenarier: skärm med formulär (vertikal rullning) och horisontell kategorilista. Båda använder ScrollView med olika egenskaper för optimalt beteende.
Profilsidan innehåller heterogena element: avatar, flera inmatningsfält, växlar och en sparaknapp. ScrollView gör det möjligt att rulla hela sidan i sin helhet, inte varje block separat.
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>
);
Egenskapen keyboardShouldPersistTaps: 'handled' möjliggör rullning och interaktion med formuläret när tangentbordet är öppet. contentContainerStyle tillämpar marginaler på allt innehåll. Detta mönster används på alla skärmar med formulär i React Native.
För navigering mellan kategorier (chattar, filter, flikar) används en horisontell ScrollView med chips. En sådan komponent förekommer ofta i marketplace- och sociala nätverksappar.
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>
);
Horisontell ScrollView med inaktiverad indikator — standard för kategoriraden. Varje chip är en separat komponent med ett markeringsläge. Egenskapen showsHorizontalScrollIndicator: false döljer rullningslisten, vilket motsvarar förväntningarna hos mobilappanvändare.
Vanliga frågor
ScrollView är lämplig för små mängder data (upp till 20-30 element) och heterogent innehåll (formulär, profiler, inställningsskärmar). Välj FlatList för långa homogena listor — nyhetsflöde, produktkatalog, meddelanden.
Använd onScroll-händelsen med onScrollEndDrag eller onMomentumScrollEnd. I nativeEvent.contentOffset.y finns den aktuella vertikala positionen. För prestanda, använd ScrollEventThrottle (iOS) för att ställa in frekvensen för onScroll-anrop.
ScrollView renderar alla element vid montering och skapar inbyggda representationer för varje. Vid 50+ element på skärmen ökar belastningen på minne och JS-tråd, vilket orsakar bildtapp. För sådana fall, använd FlatList med lazy rendering.
Ställ in bounces={false}. Denna egenskap fungerar endast på iOS och inaktiverar den fjädrande effekten vid ScrollViews kant. På Android finns studseffekten inte som standard, så egenskapen ignoreras.
ScrollView stöder inte oändlig rullning inbyggt. Man kan dock kombinera onScroll med kontroll av närhet till nedre kanten (contentOffset.y + skärmhöjd >= contentSize.height) och lägga till element i state. För seriösa datamängder, använd FlatList med onEndReached.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också