Komponen ScrollView di React Native — kontainer dengan kemampuan menggulir konten yang melebihi ukuran layar. Berbeda dengan FlatList, ScrollView me-render semua konten sekaligus, yang optimal untuk volume data kecil, formulir, dan layar dengan tinggi yang diketahui. Menurut React Native Docs, 2024, ScrollView mendukung pengguliran vertikal dan horizontal, event onScroll, kontrol posisi secara programatis, dan gerakan zoom. Komponen ini di-render sebagai UIScrollView native di iOS dan ScrollView di Android.
Poin utama
ScrollView — adalah komponen React Native yang membungkus kontennya ke dalam kontainer yang dapat digulir. Jika konten melampaui batas layar, pengguna dapat menggulirnya secara vertikal atau horizontal. ScrollView me-render semua elemen anak saat dipasang, terlepas dari apakah elemen tersebut terlihat di layar atau tidak.
Berbeda dengan FlatList yang hanya me-render elemen yang terlihat (lazy rendering), ScrollView membuat semua representasi native sekaligus. Ini membuat ScrollView nyaman untuk formulir, halaman pengaturan, kartu produk dalam satu layar — di mana pun jumlah elemen anak sedikit (hingga 20-30) atau jumlah pastinya tidak diketahui sebelumnya.
Menurut React Native Using ScrollView, 2024, ScrollView mendukung pengguliran bersarang (misalnya ScrollView di dalam ScrollView), efek bounce saat mencapai tepi, indikator gulir, jepretan posisi (snap), dan penanganan gerakan. Di iOS, ScrollView secara otomatis menambahkan jarak di bawah SafeArea melalui contentInsetAdjustmentBehavior.
ScrollView menyediakan kumpulan properti yang kaya untuk mengontrol perilaku pengguliran, tampilan, dan interaktivitas. Mari kita lihat kelompok utama: kontrol pengguliran, pengaturan visual, event, dan fitur platform.
horizontal — mengalihkan arah pengguliran dari vertikal (default) ke horizontal. scrollEnabled — menonaktifkan pengguliran jika diperlukan. showsVerticalScrollIndicator dan showsHorizontalScrollIndicator mengontrol tampilan indikator gulir. bounces (iOS) mengaktifkan/menonaktifkan efek bounce saat mencapai tepi konten.
Event utama — onScroll, yang dipanggil pada setiap pengguliran dan mengirimkan objek dengan nativeEvent yang berisi contentOffset (posisi saat ini), contentSize (ukuran konten), layoutMeasurement (ukuran area yang terlihat). onMomentumScrollEnd dipanggil setelah pengguliran inersia selesai. onScrollEndDrag — saat pengguna melepaskan layar. Event ini digunakan untuk mengimplementasikan pengguliran tak terbatas, paralaks, dan pemuatan lambat.
ScrollView menyediakan metode untuk kontrol programatis melalui referensi: scrollTo({x, y, animated}) menggulir ke koordinat yang ditentukan, scrollToEnd({animated}) — ke akhir konten, flashScrollIndicators() — untuk sementara menampilkan indikator gulir.
const scrollRef = useRef(null);
// Gulir ke atas
scrollRef.current.scrollTo({ x: 0, y: 0, animated: true });
// Gulir ke akhir
scrollRef.current.scrollToEnd({ animated: true });
Kontrol programatis pengguliran sering digunakan di chat (gulir otomatis ke pesan terakhir), formulir (gulir ke bidang yang salah), dan karusel (gulir programatis).
Pilihan antara ScrollView dan FlatList — salah satu keputusan arsitektur utama di React Native. Kedua komponen menyediakan pengguliran, tetapi menggunakan strategi rendering yang berbeda secara fundamental. ScrollView me-render semuanya sekaligus, FlatList — hanya elemen yang terlihat.
| Karakteristik | ScrollView | FlatList |
|---|---|---|
| Rendering | Semua elemen sekaligus | Hanya terlihat + buffer |
| Kinerja | Menurun pada 30+ elemen | Stabil pada jumlah berapa pun |
| Konten | Komponen apa pun (formulir, kartu) | Elemen homogen dari array |
| Volume data | Kecil dan sedang (hingga 30 elemen) | Besar dan tidak terbatas |
| Gulir horizontal | Ya (properti horizontal) | Ya (horizontal) |
| Bagian | Tidak (me-render apa adanya) | SectionList untuk bagian |
Aturan memilih: ScrollView — untuk layar di mana jumlah elemen anak diketahui dan tidak melebihi 20-30 (profil pengguna, formulir pengaturan, halaman produk). FlatList — untuk daftar dengan jumlah elemen yang berpotensi besar (umpan berita, katalog produk, pesan chat). Jika konten heterogen (judul, formulir, kartu, footer) — ScrollView lebih disukai, karena FlatList mengharapkan elemen homogen.
ScrollView mendukung pengguliran horizontal melalui properti horizontal, yang membuatnya ideal untuk karusel, galeri gambar, tab, dan daftar horizontal. Dalam kombinasi dengan properti pagingEnabled (iOS) atau snapToInterval, ScrollView berubah menjadi komponen untuk navigasi halaman.
Properti horizontal mengalihkan arah pengguliran. pagingEnabled (iOS) mengaktifkan pengguliran halaman, di mana gulir hanya berhenti di batas elemen. snapToInterval mengatur langkah jepretan dalam piksel untuk kedua platform.
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>
);
Dalam karusel ini, pagingEnabled secara otomatis menjepret gulir ke batas setiap gambar. onMomentumScrollEnd memungkinkan memperbarui indikator halaman saat ini. Karusel semacam itu berfungsi secara native dan mendukung pengguliran inersia.
Untuk langkah jepretan kustom, gunakan snapToInterval (ukuran langkah dalam piksel) dan snapToAlignment (start, center, end). Dengan snapToOffsets, Anda dapat mengatur array posisi spesifik untuk jepretan. Ini berguna untuk daftar horizontal dengan kartu berukuran berbeda.
Mari kita lihat dua skenario umum: layar dengan formulir (gulir vertikal) dan daftar kategori horizontal. Keduanya menggunakan ScrollView dengan properti berbeda untuk perilaku optimal.
Halaman edit profil berisi elemen heterogen: avatar, beberapa bidang input, sakelar, dan tombol simpan. ScrollView memungkinkan menggulir seluruh halaman secara utuh, bukan setiap blok secara terpisah.
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>
);
Properti keyboardShouldPersistTaps: 'handled' memungkinkan menggulir dan berinteraksi dengan formulir saat keyboard terbuka. contentContainerStyle menerapkan margin ke seluruh konten. Pola ini digunakan di semua layar dengan formulir di React Native.
Untuk navigasi kategori (chat, filter, tab) digunakan ScrollView horizontal dengan chip. Komponen semacam ini sering ditemukan di aplikasi marketplace dan jejaring sosial.
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 horizontal dengan indikator dinonaktifkan — standar untuk bilah kategori. Setiap chip adalah komponen terpisah dengan status pemilihan. Properti showsHorizontalScrollIndicator: false menyembunyikan bilah gulir, sesuai dengan ekspektasi pengguna aplikasi seluler.
Pertanyaan yang sering diajukan
ScrollView cocok untuk volume kecil data (hingga 20-30 elemen) dan konten heterogen (formulir, profil, layar pengaturan). Pilih FlatList untuk daftar panjang homogen — umpan berita, katalog produk, pesan.
Gunakan event onScroll dengan onScrollEndDrag atau onMomentumScrollEnd. Di nativeEvent.contentOffset.y terdapat posisi vertikal saat ini. Untuk kinerja, gunakan ScrollEventThrottle (iOS) untuk mengatur frekuensi panggilan onScroll.
ScrollView me-render semua elemen saat dipasang, membuat representasi native untuk masing-masing. Dengan 50+ elemen di layar, beban memori dan thread JS meningkat, menyebabkan penurunan frame. Untuk kasus seperti itu, gunakan FlatList dengan rendering lambat.
Setel bounces={false}. Properti ini hanya berfungsi di iOS dan menonaktifkan efek pegas saat mencapai tepi ScrollView. Di Android, efek bounce tidak ada secara default, sehingga properti diabaikan.
ScrollView tidak mendukung gulir tak terbatas secara native. Namun, Anda dapat menggabungkan onScroll dengan pemeriksaan kedekatan ke tepi bawah (contentOffset.y + tinggi layar >= contentSize.height) dan menambahkan elemen ke state. Untuk volume data yang serius, gunakan FlatList dengan onEndReached.
Kesimpulan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga