مكون ScrollView في React Native هو حاوية تسمح بتمرير المحتوى الذي يتجاوز حجم الشاشة. على عكس FlatList، يقوم ScrollView بعرض كل المحتوى مرة واحدة، وهو مثالي للكميات الصغيرة من البيانات والنماذج والشاشات ذات الارتفاع المعروف. وفقاً لـ React Native Docs، 2024، يدعم ScrollView التمرير العمودي والأفقي، وحدث onScroll، والتحكم البرمجي في الموضع، وإيماءات التكبير. يتم عرض المكون في UIScrollView الأصلي على iOS و ScrollView على Android.
النقاط الرئيسية
ScrollView هو مكون React Native يغلف محتواه في حاوية قابلة للتمرير. إذا تجاوز المحتوى حدود الشاشة، يمكن للمستخدم التمرير خلاله عمودياً أو أفقياً. يقوم ScrollView بعرض جميع العناصر الفرعية عند التثبيت، بغض النظر عما إذا كانت مرئية على الشاشة أم لا.
على عكس FlatList، الذي يعرض فقط العناصر المرئية (العرض البطيء)، يقوم ScrollView بإنشاء جميع العروض الأصلية فوراً. هذا يجعل ScrollView مناسباً للنماذج وصفحات الإعدادات وبطاقات المنتجات على شاشة واحدة — في أي مكان يكون فيه عدد العناصر الفرعية صغيراً (حتى 20-30) أو تكون كميتها الدقيقة غير معروفة مسبقاً.
وفقاً لـ React Native Using ScrollView، 2024، يدعم ScrollView التمرير المتداخل (مثل ScrollView داخل ScrollView)، وتأثير الارتداد عند الوصول إلى الحافة، ومؤشرات التمرير، وتحديد المواقع بالالتقاط، ومعالجة الإيماءات. على iOS، يضيف ScrollView تلقائياً مساحة SafeArea من خلال contentInsetAdjustmentBehavior.
ScrollView يوفر مجموعة غنية من الخصائص للتحكم في سلوك التمرير والمظهر والتفاعل. دعنا نلقي نظرة على المجموعات الرئيسية: التحكم في التمرير، الإعدادات البصرية، الأحداث، والميزات الخاصة بالمنصة.
horizontal — يغير اتجاه التمرير من العمودي (الافتراضي) إلى الأفقي. scrollEnabled — يعطل التمرير عند الحاجة. showsVerticalScrollIndicator و showsHorizontalScrollIndicator يتحكمان في عرض مؤشرات التمرير. bounces (iOS) يقوم بتشغيل/إيقاف تأثير الارتداد عند الوصول إلى حافة المحتوى.
الحدث الرئيسي هو onScroll، الذي يتم استدعاؤه عند كل تمرير ويمرر كائنًا مع nativeEvent يحتوي على contentOffset (الموضع الحالي)، contentSize (حجم المحتوى)، layoutMeasurement (حجم المنطقة المرئية). onMomentumScrollEnd يتم استدعاؤه بعد اكتمال التمرير بالقصور الذاتي. onScrollEndDrag — عندما يرفع المستخدم إصبعه عن الشاشة. تُستخدم هذه الأحداث لتنفيذ التمرير اللانهائي وتأثيرات التزيين والتحميل البطيء.
يوفر ScrollView طرقاً للتحكم البرمجي عبر ref: scrollTo({x, y, animated}) يقوم بالتمرير إلى الإحداثيات المحددة، scrollToEnd({animated}) — يقوم بالتمرير إلى نهاية المحتوى، flashScrollIndicators() — يعرض مؤشرات التمرير مؤقتاً.
const scrollRef = useRef(null);
// التمرير إلى الأعلى
scrollRef.current.scrollTo({ x: 0, y: 0, animated: true });
// التمرير إلى النهاية
scrollRef.current.scrollToEnd({ animated: true });
التحكم البرمجي في التمرير يُستخدم غالباً في الدردشات (التمرير التلقائي إلى آخر رسالة)، والنماذج (التمرير إلى حقل به خطأ)، والدوارات (التمرير البرمجي).
الاختيار بين ScrollView و FlatList هو أحد القرارات المعمارية الرئيسية في React Native. كلا المكونين يوفران التمرير، لكنهما يستخدمان استراتيجيات عرض مختلفة جوهرياً. ScrollView يعرض كل شيء مرة واحدة، FlatList — فقط العناصر المرئية.
| الخاصية | ScrollView | FlatList |
|---|---|---|
| العرض | جميع العناصر مرة واحدة | المرئية فقط + المخزن المؤقت |
| الأداء | يتدهور مع 30+ عنصراً | مستقر بأي كمية |
| المحتوى | أي مكونات (نماذج، بطاقات) | عناصر متجانسة من مصفوفة |
| حجم البيانات | صغير ومتوسط (حتى 30 عنصراً) | كبير وغير محدود |
| التمرير الأفقي | نعم (خاصية horizontal) | نعم (horizontal) |
| الأقسام | لا (يعرض كما هو) | SectionList للأقسام |
قاعدة الاختيار: ScrollView — للشاشات حيث يكون عدد العناصر الفرعية معروفاً ولا يتجاوز 20-30 (ملف المستخدم، نموذج الإعدادات، صفحة المنتج). FlatList — للقوائم ذات عدد كبير محتمل من العناصر (خلاصة الأخبار، كتالوج المنتجات، رسائل الدردشة). إذا كان المحتوى غير متجانس (رأس، نموذج، بطاقة، تذييل) — فإن ScrollView أفضل لأن FlatList يتوقع عناصر متجانسة.
ScrollView يدعم التمرير الأفقي من خلال الخاصية horizontal، مما يجعله مثالياً للدوارات ومعارض الصور والعلامات التبويبية والقوائم الأفقية. عند دمجه مع الخاصية pagingEnabled (iOS) أو snapToInterval، يتحول ScrollView إلى مكون للتنقل بالصفحات.
الخاصية horizontal تغير اتجاه التمرير. pagingEnabled (iOS) تفعل التمرير بالصفحات، حيث يتوقف التمرير فقط عند حدود العناصر. snapToInterval يحدد خطوة الالتقاط بالبكسل لكلتا المنصتين.
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>
);
في هذه الدوارة، pagingEnabled يقوم تلقائياً بتثبيت التمرير عند حدود كل صورة. onMomentumScrollEnd يسمح بتحديث مؤشر الصفحة الحالية. تعمل هذه الدوارة بشكل أصلي وتدعم التمرير بالقصور الذاتي.
لخطوات الالتقاط غير القياسية، استخدم snapToInterval (حجم الخطوة بالبكسل) و snapToAlignment (start، center، end). باستخدام snapToOffsets يمكنك تحديد مصفوفة من المواضع المحددة للالتقاط. هذا مفيد للقوائم الأفقية ذات البطاقات بأحجام مختلفة.
دعنا نلقي نظرة على سيناريوهين نموذجيين: شاشة بها نموذج (تمرير عمودي) وقائمة أفقية للفئات. كلاهما يستخدم ScrollView مع خصائص مختلفة للسلوك الأمثل.
صفحة تحرير الملف الشخصي تحتوي على عناصر غير متجانسة: صورة رمزية، عدة حقول إدخال، مفاتيح تبديل وزر حفظ. يسمح ScrollView بتمرير الصفحة بأكملها ككل، بدلاً من كل كتلة على حدة.
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' تسمح بالتمرير والتفاعل مع النموذج عندما تكون لوحة المفاتيح مفتوحة. contentContainerStyle يطبق مساحة على كل المحتوى. هذا النمط يستخدم في جميع شاشات النماذج في React Native.
للتنقل عبر الفئات (الدردشات، الفلاتر، العلامات التبويبية)، يتم استخدام ScrollView أفقي مع رقاقات. هذا المكون شائع في تطبيقات المتاجر ووسائل التواصل الاجتماعي.
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 أفقي مع مؤشر معطل هو المعيار لشرائط الفئات. كل رقاقة هي مكون منفصل بحالة تحديد. الخاصية showsHorizontalScrollIndicator: false تزيل شريط التمرير، وهو ما يتوافق مع توقعات مستخدمي التطبيقات المحمولة.
الأسئلة الشائعة
ScrollView مناسب لـ الكميات الصغيرة من البيانات (حتى 20-30 عنصراً) والمحتوى غير المتجانس (النماذج، الملفات الشخصية، شاشات الإعدادات). اختر FlatList للقوائم الطويلة المتجانسة — خلاصة الأخبار، كتالوج المنتجات، الرسائل.
استخدم الحدث onScroll مع onScrollEndDrag أو onMomentumScrollEnd. الموضع العمودي الحالي موجود في nativeEvent.contentOffset.y. للأداء، استخدم ScrollEventThrottle (iOS) لضبط تردد استدعاء onScroll.
ScrollView يعرض جميع العناصر عند التثبيت، مما ينشئ عروضاً أصلية لكل عنصر. مع 50+ عنصراً على الشاشة، يزداد حمل الذاكرة ومؤشر JS، مما يسبب انخفاض الإطارات. لهذه الحالات، استخدم FlatList مع العرض البطيء.
قم بتعيين bounces={false}. هذه الخاصية تعمل فقط على iOS وتعطل التأثير الزنبركي عند الوصول إلى حافة ScrollView. على Android، لا يوجد تأثير ارتداد افتراضياً، لذلك يتم تجاهل الخاصية.
ScrollView لا يدعم التمرير اللانهائي أصلاً. ومع ذلك، يمكنك دمج onScroll مع التحقق من الاقتراب من الحافة السفلية (contentOffset.y + ارتفاع الشاشة >= contentSize.height) وإضافة عناصر إلى الحالة. للكميات الكبيرة، استخدم FlatList مع onEndReached.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.