ScrollView — apa itu, kontainer scroll dan React Native

Penulis: IT Sectr Diterbitkan: 2026-07-05 Waktu membaca: 10 mnt

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 — kontainer dengan pengguliran yang me-render semua konten secara utuh
  • Mendukung pengguliran vertikal dan horizontal
  • Di-render sebagai UIScrollView di iOS dan ScrollView di Android
  • Menyediakan kontrol programatis pengguliran melalui scrollTo
  • Untuk daftar besar gunakan FlatList atau SectionList daripada ScrollView

Apa itu ScrollView di React Native

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.

Properti dan API komponen ScrollView

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.

Kontrol arah dan pengguliran

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 ScrollView

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.

Kontrol programatis melalui ref

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.

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

Perbedaan ScrollView dan FlatList

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.

KarakteristikScrollViewFlatList
RenderingSemua elemen sekaligusHanya terlihat + buffer
KinerjaMenurun pada 30+ elemenStabil pada jumlah berapa pun
KontenKomponen apa pun (formulir, kartu)Elemen homogen dari array
Volume dataKecil dan sedang (hingga 30 elemen)Besar dan tidak terbatas
Gulir horizontalYa (properti horizontal)Ya (horizontal)
BagianTidak (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.

Pengguliran horizontal dan paginasi

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.

Karusel horizontal

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.

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

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.

Jepretan ke posisi (Snap)

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.

Contoh praktis dengan ScrollView

Mari kita lihat dua skenario umum: layar dengan formulir (gulir vertikal) dan daftar kategori horizontal. Keduanya menggunakan ScrollView dengan properti berbeda untuk perilaku optimal.

Contoh 1: layar profil dengan formulir

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.

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

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.

Contoh 2: daftar kategori horizontal

Untuk navigasi kategori (chat, filter, tab) digunakan ScrollView horizontal dengan chip. Komponen semacam ini sering ditemukan di aplikasi marketplace dan jejaring sosial.

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 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

Kapan menggunakan ScrollView daripada FlatList?

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.

Bagaimana cara melacak posisi gulir?

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.

Mengapa ScrollView lambat dengan banyak elemen?

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.

Bagaimana cara menonaktifkan efek bounce di iOS?

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.

Bagaimana cara membuat gulir tak terbatas dengan ScrollView?

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

  • ScrollView — kontainer React Native dengan gulir yang me-render semua konten saat dipasang
  • Mendukung pengguliran vertikal dan horizontal melalui properti horizontal
  • Kontrol programatis: scrollTo, scrollToEnd, flashScrollIndicators melalui ref
  • Untuk daftar besar gunakan FlatList — ScrollView lambat pada 30+ elemen
  • ScrollView horizontal dengan pagingEnabled — dasar untuk karusel dan galeri
  • Event onScroll, onMomentumScrollEnd, onScrollEndDrag untuk melacak posisi
  • KeyboardShouldPersistTaps wajib untuk formulir di dalam ScrollView

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.

Diskusikan proyek

Baca juga