Komponent ScrollView v React Native — kontejner s možností posouvání obsahu, který přesahuje rozměry obrazovky. Na rozdíl od FlatList, ScrollView vykresluje veškerý obsah najednou, což je optimální pro malá množství dat, formuláře a obrazovky se známou výškou. Podle React Native Docs, 2024, ScrollView podporuje vertikální a horizontální posouvání, událost onScroll, programové ovládání pozice a gesta zoomu. Komponent se vykresluje jako nativní UIScrollView na iOS a ScrollView na Androidu.
Hlavní body
ScrollView — je komponent React Native, který obaluje svůj obsah do posouvacího kontejneru. Pokud obsah překračuje hranice obrazovky, uživatel jej může posouvat vertikálně nebo horizontálně. ScrollView vykresluje všechny podřízené prvky při montáži, bez ohledu na to, zda jsou na obrazovce viditelné či nikoli.
Na rozdíl od FlatList, který vykresluje pouze viditelné prvky (líné vykreslování), ScrollView vytváří všechna nativní zobrazení najednou. To činí ScrollView pohodlným pro formuláře, stránky nastavení, karty produktů na jedné obrazovce — všude tam, kde je počet podřízených prvků malý (do 20-30) nebo jejich přesný počet není předem znám.
Podle React Native Using ScrollView, 2024, ScrollView podporuje vněnožené posouvání (např. ScrollView uvnitř ScrollView), efekt odskoku při dosažení okraje, indikátory posouvání, přichycení pozice (snap) a zpracování gest. Na iOS ScrollView automaticky přidává odsazení pod SafeArea přes contentInsetAdjustmentBehavior.
ScrollView poskytuje bohatou sadu vlastností pro ovládání chování posouvání, vzhledu a interaktivity. Podívejme se na klíčové skupiny: ovládání posouvání, vizuální nastavení, události a platformní funkce.
horizontal — přepíná směr posouvání z vertikálního (výchozí) na horizontální. scrollEnabled — v případě potřeby vypne posouvání. showsVerticalScrollIndicator a showsHorizontalScrollIndicator ovládají zobrazení indikátorů posouvání. bounces (iOS) zapíná/vypíná efekt odskoku při dosažení okraje obsahu.
Hlavní událost — onScroll, volaná při každém posouvání a předávající objekt s nativeEvent, obsahující contentOffset (aktuální pozice), contentSize (velikost obsahu), layoutMeasurement (velikost viditelné oblasti). onMomentumScrollEnd se volá po dokončení setrvačného posouvání. onScrollEndDrag — když uživatel pustil obrazovku. Tyto události se používají k implementaci nekonečného posouvání, paralaxy a líného načítání.
ScrollView poskytuje metody pro programové ovládání přes referenci: scrollTo({x, y, animated}) posouvá na zadané souřadnice, scrollToEnd({animated}) — na konec obsahu, flashScrollIndicators() — dočasně zobrazí indikátory posouvání.
const scrollRef = useRef(null);
// Posunout nahoru
scrollRef.current.scrollTo({ x: 0, y: 0, animated: true });
// Posunout na konec
scrollRef.current.scrollToEnd({ animated: true });
Programové ovládání posouvání se často používá v chatech (automatické posouvání k poslední zprávě), formulářích (posouvání k poli s chybou) a karuselech (programové posouvání).
Výběr mezi ScrollView a FlatList — jedno z klíčových architektonických rozhodnutí v React Native. Oba komponenty poskytují posouvání, ale používají zásadně odlišné strategie vykreslování. ScrollView vykresluje vše najednou, FlatList — pouze viditelné prvky.
| Vlastnost | ScrollView | FlatList |
|---|---|---|
| Vykreslování | Všechny prvky najednou | Pouze viditelné + buffer |
| Výkon | Klesá při 30+ prvcích | Stabilní při libovolném množství |
| Obsah | Libovolné komponenty (formuláře, karty) | Homogenní prvky z pole |
| Velikost dat | Malá a střední (do 30 prvků) | Velká a neomezená |
| Horizontální posouvání | Ano (vlastnost horizontal) | Ano (horizontal) |
| Sekce | Ne (vykresluje jak je) | SectionList pro sekce |
Pravidlo výběru: ScrollView — pro obrazovky, kde je počet podřízených prvků známý a nepřesahuje 20-30 (profil uživatele, formulář nastavení, stránka produktu). FlatList — pro seznamy s potenciálně velkým počtem prvků (zpravodajský kanál, katalog produktů, zprávy chatu). Pokud je obsah heterogenní (nadpis, formulář, karta, zápatí) — ScrollView je výhodnější, protože FlatList očekává homogenní prvky.
ScrollView podporuje horizontální posouvání přes vlastnost horizontal, což jej činí ideálním pro karusely, galerie obrázků, záložky a horizontální seznamy. V kombinaci s vlastností pagingEnabled (iOS) nebo snapToInterval se ScrollView stává komponentem pro stránkovou navigaci.
Vlastnost horizontal přepíná směr posouvání. pagingEnabled (iOS) zapíná stránkové posouvání, při kterém se posouvání zastavuje pouze na hranicích prvků. snapToInterval nastavuje krok přichycení v pixelech pro obě platformy.
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>
);
V tomto karuselu pagingEnabled automaticky přichycuje posouvání k hranicím každého obrázku. onMomentumScrollEnd umožňuje aktualizovat indikátor aktuální stránky. Takový karusel funguje nativně a podporuje setrvačné posouvání.
Pro vlastní kroky přichycení se používá snapToInterval (velikost kroku v pixelech) a snapToAlignment (start, center, end). Pomocí snapToOffsets lze nastavit pole konkrétních pozic pro přichycení. To je užitečné pro horizontální seznamy s kartami různých velikostí.
Podívejme se na dva typické scénáře: obrazovku s formulářem (vertikální posouvání) a horizontální seznam kategorií. Oba používají ScrollView s různými vlastnostmi pro optimální chování.
Stránka úpravy profilu obsahuje heterogenní prvky: avatar, několik vstupních polí, přepínače a tlačítko uložení. ScrollView umožňuje posouvání celé stránky v celku, nikoli každého bloku zvlášť.
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>
);
Vlastnost keyboardShouldPersistTaps: 'handled' umožňuje posouvání a interakci s formulářem, když je klávesnice otevřená. contentContainerStyle aplikuje okraje na veškerý obsah. Tento vzor se používá na všech obrazovkách s formuláři v React Native.
Pro navigaci po kategoriích(chaty, filtry, záložky) se používá horizontální ScrollView s chipy. Takový komponent se často vyskytuje v aplikacích marketplace a sociálních sítí.
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>
);
Horizontální ScrollView s vypnutým indikátorem — standard pro lištu kategorií. Každý chip je samostatný komponent se stavem výběru. Vlastnost showsHorizontalScrollIndicator: false skrývá lištu posouvání, což odpovídá očekáváním uživatelů mobilních aplikací.
Často kladené otázky
ScrollView je vhodný pro malá množství dat (do 20-30 prvků) a heterogenní obsah (formuláře, profily, obrazovky nastavení). FlatList vyberte pro dlouhé homogenní seznamy — zpravodajský kanál, katalog produktů, zprávy.
Použijte událost onScroll s onScrollEndDrag nebo onMomentumScrollEnd. V nativeEvent.contentOffset.y je obsažena aktuální vertikální pozice. Pro výkon použijte ScrollEventThrottle (iOS) pro nastavení frekvence volání onScroll.
ScrollView vykresluje všechny prvky při montáži, vytváří nativní zobrazení pro každý. Při 50+ prvcích na obrazovce roste zatížení paměti a JS vlákna, což způsobuje pokles snímků. Pro takové případy použijte FlatList s líným vykreslováním.
Nastavte bounces={false}. Tato vlastnost funguje pouze na iOS a vypíná pružný efekt při dosažení okraje ScrollView. Na Androidu efekt odskoku ve výchozím nastavení neexistuje, takže vlastnost je ignorována.
ScrollView nativně nepodporuje nekonečné posouvání. Lze však kombinovat onScroll s kontrolou přiblížení k dolnímu okraji (contentOffset.y + výška obrazovky >= contentSize.height) a přidávat prvky do stavu. Pro velké objemy dat použijte FlatList s onEndReached.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také