React Native-dagi ScrollView komponenti — ekran o‘lchamlaridan oshib ketadigan tarkibni aylantirish imkoniyatiga ega konteyner. FlatList-dan farqli o‘laroq, ScrollView barcha tarkibni birdaniga render qiladi, bu kichik hajmdagi ma‘lumotlar, formalar va ma‘lum balandlikdagi ekranlar uchun optimaldir. React Native Docs, 2024-ga ko‘ra, ScrollView vertikal va gorizontal aylantirish, onScroll hodisasi, dasturiy pozitsiya boshqaruvi va zoom imo-ishoralarini qo‘llab-quvvatlaydi. Komponent iOS-da native UIScrollView va Android-da ScrollView sifatida render qilinadi.
Asosiy ma‘lumotlar
ScrollView — tarkibini aylantiriladigan konteynerga o‘raydigan React Native komponentidir. Agar tarkib ekran chegaralaridan chiqib ketsa, foydalanuvchi uni vertikal yoki gorizontal aylantirishi mumkin. ScrollView o‘rnatish vaqtida barcha bola elementlarni render qiladi, ular ekranda ko‘rinadigan bo‘lishidan qat‘iy nazar.
Faqat ko‘rinadigan elementlarni render qiladigan FlatList-dan (lazy rendering) farqli o‘laroq, ScrollView barcha native ko‘rinishlarni birdaniga yaratadi. Bu ScrollView-ni formalar, sozlamalar sahifalari, bir ekrandagi mahsulot kartalari uchun qulay qiladi — bola elementlar soni kichik bo‘lgan (20-30 gacha) yoki ularning aniq soni oldindan noma‘lum bo‘lgan hollarda.
React Native Using ScrollView, 2024-ga ko‘ra, ScrollView ichma-ich aylantirishni (masalan, ScrollView ichida ScrollView), chekkaga yetganda bounce effektini, aylantirish ko‘rsatkichlarini, pozitsiya snap-ini va imo-ishoralarni qo‘llab-quvvatlaydi. iOS-da ScrollView contentInsetAdjustmentBehavior orqali SafeArea ostiga avtomatik bo‘shliq qo‘shadi.
ScrollView aylantirish xatti-harakatini, ko‘rinishini va interaktivligini boshqarish uchun boy xususiyatlar to‘plamini taqdim etadi. Asosiy guruhlarni ko‘rib chiqamiz: aylantirish boshqaruvi, vizual sozlamalar, hodisalar va platforma xususiyatlari.
horizontal — aylantirish yo‘nalishini vertikal (standart) dan gorizontalga o‘zgartiradi. scrollEnabled — kerak bo‘lganda aylantirishni o‘chiradi. showsVerticalScrollIndicator va showsHorizontalScrollIndicator aylantirish ko‘rsatkichlarini boshqaradi. bounces (iOS) tarkib chekkasiga yetganda bounce effektini yoqadi/o‘chiradi.
Asosiy hodisa — onScroll, har bir aylantirishda chaqiriladi va nativeEvent bilan obyektni uzatadi, tarkibida contentOffset (joriy pozitsiya), contentSize (tarkib hajmi), layoutMeasurement (ko‘rinadigan maydon hajmi). onMomentumScrollEnd inertial aylantirish tugagandan so‘ng chaqiriladi. onScrollEndDrag — foydalanuvchi ekranni qo‘yib yuborganda. Bu hodisalar cheksiz aylantirish, parallaks va kechiktirilgan yuklashni amalga oshirish uchun ishlatiladi.
ScrollView referans orqali dasturiy boshqaruv uchun metodlarni taqdim etadi: scrollTo({x, y, animated}) ko‘rsatilgan koordinatalarga aylantiradi, scrollToEnd({animated}) — tarkib oxiriga, flashScrollIndicators() — vaqtincha aylantirish ko‘rsatkichlarini ko‘rsatadi.
const scrollRef = useRef(null);
// Yuqoriga aylantir
scrollRef.current.scrollTo({ x: 0, y: 0, animated: true });
// Oxiriga aylantir
scrollRef.current.scrollToEnd({ animated: true });
Aylantirishning dasturiy boshqaruvi chatlarda (oxirgi xabarga avtomatik aylantirish), formalarda (xatoli maydonga aylantirish) va karusellarda (dasturiy aylantirish) tez-tez ishlatiladi.
ScrollView va FlatList o‘rtasidagi tanlov — React Native-dagi asosiy arxitektura qarorlaridan biridir. Ikkala komponent aylantirishni ta‘minlaydi, ammo tubdan farqli render strategiyalaridan foydalanadi. ScrollView hamma narsani birdaniga render qiladi, FlatList — faqat ko‘rinadigan elementlarni.
| Xususiyat | ScrollView | FlatList |
|---|---|---|
| Render | Barcha elementlar birdaniga | Faqat ko‘rinadiganlar + bufer |
| Samaradorlik | 30+ elementda pasayadi | Har qanday miqdorda barqaror |
| Tarkib | Har qanday komponentlar (formalar, kartalar) | Massivdan bir xil elementlar |
| Ma‘lumot hajmi | Kichik va o‘rta (30 elementgacha) | Katta va cheksiz |
| Gorizontal aylantirish | Ha (horizontal xususiyati) | Ha (horizontal) |
| Bo‘limlar | Yo‘q (qanday bo‘lsa shunday render qiladi) | Bo‘limlar uchun SectionList |
Tanlov qoidasi: ScrollView — bola elementlari soni ma‘lum va 20-30 dan oshmaydigan ekranlar uchun (foydalanuvchi profili, sozlamalar formasi, mahsulot sahifasi). FlatList — potensial ko‘p elementli ro‘yxatlar uchun (yangiliklar lentasi, mahsulot katalogi, chat xabarlari). Tarkib xilma-xil bo‘lsa (sarlavha, forma, karta, footer) — ScrollView afzalroq, chunki FlatList bir xil elementlarni kutadi.
ScrollView horizontal xususiyati orqali gorizontal aylantirishni qo‘llab-quvvatlaydi, bu uni karusellar, rasm galereyalari, tablar va gorizontal ro‘yxatlar uchun ideal qiladi. pagingEnabled (iOS) yoki snapToInterval bilan birgalikda ScrollView sahifa navigatsiyasi komponentiga aylanadi.
horizontal xususiyati aylantirish yo‘nalishini o‘zgartiradi. pagingEnabled (iOS) sahifali aylantirishni yoqadi, bunda scroll faqat elementlar chegaralarida to‘xtaydi. snapToInterval ikkala platforma uchun pikseldagi snap qadamini belgilaydi.
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>
);
Bu karuselda pagingEnabled avtomatik ravishda scroll-ni har bir rasmning chegaralariga yopishtiradi. onMomentumScrollEnd joriy sahifa ko‘rsatkichini yangilashga imkon beradi. Bunday karusel native ishlaydi va inertial aylantirishni qo‘llab-quvvatlaydi.
Nostandart snap qadamlari uchun snapToInterval (pikseldagi qadam hajmi) va snapToAlignment (start, center, end) ishlatiladi. snapToOffsets orqali snap uchun aniq pozitsiyalar massivini belgilash mumkin. Bu har xil o‘lchamdagi kartalari bo‘lgan gorizontal ro‘yxatlar uchun foydalidir.
Ikkita tipik stsenariyni ko‘rib chiqamiz: formali ekran (vertikal aylantirish) va gorizontal kategoriyalar ro‘yxati. Ikkalasi optimal xatti-harakat uchun turli xususiyatlar bilan ScrollView dan foydalanadi.
Profilni tahrirlash sahifasi turli elementlarni o‘z ichiga oladi: avatar, bir nechta kiritish maydonlari, kalitlar va saqlash tugmasi. ScrollView butun sahifani to‘liq aylantirishga imkon beradi, har bir blokni alohida emas.
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>
);
keyboardShouldPersistTaps: 'handled' xususiyati klaviatura ochiq bo‘lganda aylantirish va forma bilan o‘zaro aloqaga imkon beradi. contentContainerStyle barcha tarkibga bo‘shliqlarni qo‘llaydi. Bu naqsh React Native-dagi barcha formal ekranlarida ishlatiladi.
Kategoriyalar bo‘yicha navigatsiya uchun (chatlar, filtrlar, tablar) chiplar bilan gorizontal ScrollView ishlatiladi. Bunday komponent ko‘pincha marketplace va ijtimoiy tarmoq ilovalarida uchraydi.
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>
);
Ko‘rsatkichi o‘chirilgan gorizontal ScrollView — kategoriyalar paneli uchun standartdir. Har bir chip tanlov holati bilan alohida komponentdir. showsHorizontalScrollIndicator: false xususiyati aylantirish panelini yashiradi, bu mobil ilova foydalanuvchilarining kutishlariga mos keladi.
Tez-tez beriladigan savollar
ScrollView kichik hajmdagi ma‘lumotlar (20-30 elementgacha) va turli tarkib (formalar, profillar, sozlama ekranlari) uchun mos keladi. FlatList-ni uzun bir xil ro‘yxatlar uchun tanlang — yangiliklar lentasi, mahsulot katalogi, xabarlar.
onScroll hodisasini onScrollEndDrag yoki onMomentumScrollEnd bilan ishlating. nativeEvent.contentOffset.y joriy vertikal pozitsiyani o‘z ichiga oladi. Samaradorlik uchun ScrollEventThrottle (iOS) dan foydalanib onScroll chaqirish chastotasini sozlang.
ScrollView o‘rnatish vaqtida barcha elementlarni render qiladi, har biri uchun native ko‘rinishlar yaratadi. Ekranda 50+ element bo‘lganda, xotira va JS oqimi yuki ortadi, kadr tushishlariga sabab bo‘ladi. Bunday hollarda FlatList dan kechiktirilgan render bilan foydalaning.
bounces={false} ni o‘rnating. Bu xususiyat faqat iOS-da ishlaydi va ScrollView chekkasiga yetganda prujina effektini o‘chiradi. Android-da bounce effekti standart sifatida mavjud emas, shuning uchun xususiyat e‘tiborga olinmaydi.
ScrollView native ravishda cheksiz aylantirishni qo‘llab-quvvatlamaydi. Biroq onScroll-ni pastki chekkaga yaqinlashishni tekshirish bilan (contentOffset.y + ekran balandligi >= contentSize.height) birlashtirib, elementlarni state-ga qo‘shish mumkin. Katta hajmdagi ma‘lumotlar uchun FlatList-dan onEndReached bilan foydalaning.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.