ScrollView — ce este, container de derulare și React Native

Autor: IT Sectr Publicat: 2026-07-05 Timp de citire: 10 min

Componenta ScrollView în React Native — un container cu posibilitatea de derulare a conținutului care depășește dimensiunile ecranului. Spre deosebire de FlatList, ScrollView redă tot conținutul imediat, ceea ce este optim pentru volume mici de date, formulare și ecrane cu înălțime cunoscută. Conform React Native Docs, 2024, ScrollView suportă derularea verticală și orizontală, evenimentul onScroll, controlul programatic al poziției și gesturile de zoom. Componenta se redă în UIScrollView nativ pe iOS și ScrollView pe Android.

Principalele puncte

  • ScrollView — container cu derulare care redă tot conținutul integral
  • Suportă derularea verticală și orizontală
  • Se redă în UIScrollView pe iOS și ScrollView pe Android
  • Oferă control programatic al derulării prin scrollTo
  • Pentru liste mari utilizați FlatList sau SectionList în loc de ScrollView

Ce este ScrollView în React Native

ScrollView — este o componentă React Native care își înfășoară conținutul într-un container derulabil. Dacă conținutul depășește limitele ecranului, utilizatorul poate derula vertical sau orizontal. ScrollView redă toate elementele copil la montare, indiferent dacă sunt vizibile pe ecran sau nu.

Spre deosebire de FlatList, care redă doar elementele vizibile (lazy rendering), ScrollView creează toate reprezentările native imediat. Acest lucru face ScrollView convenabil pentru formulare, pagini de setări, carduri de produs pe un singur ecran — oriunde numărul elementelor copil este mic (până la 20-30) sau numărul exact nu este cunoscut dinainte.

Conform React Native Using ScrollView, 2024, ScrollView suportă derularea îmbricată (de exemplu, ScrollView în interiorul ScrollView), efectul de bounce la atingerea marginii, indicatoare de derulare, fixarea poziției (snap) și gestionarea gesturilor. Pe iOS, ScrollView adaugă automat spațiu sub SafeArea prin contentInsetAdjustmentBehavior.

Proprietăți și API ale componentei ScrollView

ScrollView oferă un set bogat de proprietăți pentru controlul comportamentului de derulare, aspectului și interactivității. Să examinăm grupurile cheie: controlul derulării, setări vizuale, evenimente și caracteristici de platformă.

Controlul direcției și derulării

horizontal — comută direcția de derulare de la verticală (implicit) la orizontală. scrollEnabled — dezactivează derularea la nevoie. showsVerticalScrollIndicator și showsHorizontalScrollIndicator controlează afișarea indicatoarelor de derulare. bounces (iOS) activează/dezactivează efectul de bounce la atingerea marginii conținutului.

Evenimente ScrollView

Evenimentul principal — onScroll, apelat la fiecare derulare și care transmite un obiect cu nativeEvent, conținând contentOffset (poziția curentă), contentSize (dimensiunea conținutului), layoutMeasurement (dimensiunea zonei vizibile). onMomentumScrollEnd este apelat după terminarea derulării prin inerție. onScrollEndDrag — când utilizatorul a eliberat ecranul. Aceste evenimente sunt utilizate pentru implementarea derulării infinite, paralaxei și încărcării leneșe.

Control programatic prin ref

ScrollView oferă metode pentru control programatic prin referință: scrollTo({x, y, animated}) derulează la coordonatele specificate, scrollToEnd({animated}) — la sfârșitul conținutului, flashScrollIndicators() — arată temporar indicatoarele de derulare.

js
const scrollRef = useRef(null);

// Derulați sus
scrollRef.current.scrollTo({ x: 0, y: 0, animated: true });

// Derulați la sfârșit
scrollRef.current.scrollToEnd({ animated: true });

Controlul programatic al derulării este adesea utilizat în chat-uri (derulare automată la ultimul mesaj), formulare (derulare la câmpul cu eroare) și carusele (derulare programatică).

Diferențele dintre ScrollView și FlatList

Alegerea între ScrollView și FlatList — una dintre deciziile arhitecturale cheie în React Native. Ambele componente asigură derularea, dar folosesc strategii fundamental diferite de redare. ScrollView redă totul imediat, FlatList — doar elementele vizibile.

CaracteristicăScrollViewFlatList
RedareToate elementele imediatDoar vizibile + buffer
PerformanțăScade la 30+ elementeStabilă la orice cantitate
ConținutOrice componente (formulare, carduri)Elemente omogene din array
Volum dateMic și mediu (până la 30 elemente)Mare și nelimitat
Derulare orizontalăDa (proprietatea horizontal)Da (horizontal)
SecțiuniNu (redă așa cum este)SectionList pentru secțiuni

Regula de alegere: ScrollView — pentru ecrane unde numărul elementelor copil este cunoscut și nu depășește 20-30 (profil de utilizator, formular de setări, pagină de produs). FlatList — pentru liste cu un număr potențial mare de elemente (flux de știri, catalog de produse, mesaje de chat). Dacă conținutul este eterogen (titlu, formular, card, footer) — ScrollView este preferabil, deoarece FlatList așteaptă elemente omogene.

Derularea orizontală și paginarea

ScrollView suportă derularea orizontală prin proprietatea horizontal, ceea ce îl face ideal pentru carusele, galerii de imagini, file și liste orizontale. În combinație cu proprietatea pagingEnabled (iOS) sau snapToInterval, ScrollView se transformă într-o componentă pentru navigare paginată.

Carusel orizontal

Proprietatea horizontal comută direcția de derulare. pagingEnabled (iOS) activează derularea paginată, unde derularea se oprește doar la marginile elementelor. snapToInterval setează pasul de fixare în pixeli pentru ambele platforme.

js
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>
);

În acest carusel, pagingEnabled fixează automat derularea la marginile fiecărei imagini. onMomentumScrollEnd permite actualizarea indicatorului paginii curente. Un astfel de carusel funcționează nativ și suportă derularea prin inerție.

Fixarea la poziție (Snap)

Pentru pași de fixare personalizați se utilizează snapToInterval (dimensiunea pasului în pixeli) și snapToAlignment (start, center, end). Cu snapToOffsets se poate seta un array de poziții specifice pentru fixare. Acest lucru este util pentru liste orizontale cu carduri de dimensiuni diferite.

Exemple practice cu ScrollView

Să examinăm două scenarii tipice: ecranul cu formular (derulare verticală) și lista orizontală de categorii. Ambele utilizează ScrollView cu diferite proprietăți pentru un comportament optim.

Exemplul 1: ecran de profil cu formular

Pagina de editare a profilului conține elemente eterogene: avatar, câteva câmpuri de introducere, comutatoare și un buton de salvare. ScrollView permite derularea întregii pagini în întregime, nu a fiecărui bloc separat.

js
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>
);

Proprietatea keyboardShouldPersistTaps: 'handled' permite derularea și interacțiunea cu formularul când tastatura este deschisă. contentContainerStyle aplică margini întregului conținut. Acest model este utilizat în toate ecranele cu formulare în React Native.

Exemplul 2: lista orizontală de categorii

Pentru navigarea pe categorii (chat-uri, filtre, file) se utilizează un ScrollView orizontal cu cipuri. O astfel de componentă apare frecvent în aplicațiile de marketplace și rețele sociale.

js
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 orizontal cu indicatorul dezactivat — standardul pentru bara de categorii. Fiecare cip este o componentă separată cu stare de selecție. Proprietatea showsHorizontalScrollIndicator: false ascunde bara de derulare, ceea ce corespunde așteptărilor utilizatorilor de aplicații mobile.

Întrebări frecvente

Când să folosesc ScrollView în loc de FlatList?

ScrollView este potrivit pentru volume mici de date (până la 20-30 de elemente) și conținut eterogen (formulare, profiluri, ecrane de setări). FlatList alegeți pentru liste lungi omogene — flux de știri, catalog de produse, mesaje.

Cum să urmăresc poziția de derulare?

Utilizați evenimentul onScroll cu onScrollEndDrag sau onMomentumScrollEnd. În nativeEvent.contentOffset.y se află poziția verticală curentă. Pentru performanță, utilizați ScrollEventThrottle (iOS) pentru a seta frecvența apelării onScroll.

De ce ScrollView încetinește cu un număr mare de elemente?

ScrollView redă toate elementele la montare, creând reprezentări native pentru fiecare. La 50+ elemente pe ecran, încărcarea memoriei și a firului JS crește, provocând căderi de cadre. Pentru astfel de cazuri, utilizați FlatList cu redare leneșă.

Cum să dezactivez efectul de bounce pe iOS?

Setați bounces={false}. Această proprietate funcționează doar pe iOS și dezactivează efectul elastic la atingerea marginii ScrollView. Pe Android efectul de bounce nu există implicit, deci proprietatea este ignorată.

Cum să fac derulare infinită cu ScrollView?

ScrollView nu suportă derularea infinită nativ. Cu toate acestea, se poate combina onScroll cu verificarea apropierii de marginea inferioară (contentOffset.y + înălțimea ecranului >= contentSize.height) și adăugarea elementelor în stare. Pentru volume serioase de date, utilizați FlatList cu onEndReached.

Rezumat

  • ScrollView — container React Native cu derulare care redă tot conținutul la montare
  • Suportă derularea verticală și orizontală prin proprietatea horizontal
  • Control programatic: scrollTo, scrollToEnd, flashScrollIndicators prin ref
  • Pentru liste mari utilizați FlatList — ScrollView încetinește la 30+ elemente
  • ScrollView orizontal cu pagingEnabled — baza pentru carusele și galerii
  • Evenimentele onScroll, onMomentumScrollEnd, onScrollEndDrag pentru urmărirea poziției
  • KeyboardShouldPersistTaps obligatoriu pentru formulare în interiorul ScrollView

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și