FlatList: ما هي، API والتحسين في React Native

المؤلف: IT Sectr نُشر: 2026-07-05 وقت القراءة: 10 دق

FlatList هو المكون الرئيسي في React Native لعرض قوائم عالية الأداء مع التخيل الافتراضي للعناصر. على عكس ScrollView، يقوم FlatList بعرض العناصر المرئية فقط على الشاشة، مما يوفر الذاكرة والمعالج. يدعم المكون التمرير الأفقي والعمودي، السحب للتحديث والتحميل اللانهائي. اقرأ المزيد عن بنية القوائم في توثيق Meta.

النقاط الرئيسية

  • FlatList هو مكون قائمة افتراضية يعرض العناصر المرئية فقط ويعيد استخدامها أثناء التمرير
  • الأداء يتحقق من خلال العرض بنوافذ — العناصر خارج الشاشة لا يتم إنشاؤها
  • API تشمل renderItem و keyExtractor و ItemSeparatorComponent و ListHeaderComponent و ListFooterComponent
  • القوائم الأفقية تُكوّن عبر الخاصية horizontal وتغير اتجاه التمرير إلى المحور X
  • التحسين يتطلب إعدادًا صحيحًا لـ keyExtractor و useMemo للبيانات و getItemLayout للأحجام الثابتة

ما هي FlatList؟

FlatList هو مكون React Native يطبق قائمة افتراضية مع عرض عالي الأداء لمجموعات البيانات الكبيرة. المكون مبني فوق VirtualizedList ويوفر API تصريحية لإنشاء قوائم مسطحة بأي درجة من التعقيد.

تم تقديم FlatList في React Native 0.43 كبديل لـ ListView القديم. وفقًا لـ Meta (2026)، يُستخدم FlatList في 85% من تطبيقات React Native التي تعمل مع القوائم. يدعم المكون جميع السيناريوهات الشائعة: جهات الاتصال، خلاصات الأخبار، كتالوجات المنتجات والمحادثات.

التاريخ والمكان في النظام البيئي

قبل FlatList، كان المطورون يستخدمون ListView الذي يتطلب تهيئة يدوية لإعادة استخدام الخلايا. قام FlatList بأتمتة هذه العملية من خلال تطبيق العرض بنوافذ المشابه لـ RecyclerView في Android (2014) و UICollectionView في iOS (2012). في المشاريع الحديثة، FlatList هو المعيار الفعلي لأي قائمة.

كيف يعمل التخيل الافتراضي في FlatList

التخيل الافتراضي في FlatList هو آلية حيث يقوم المكون بعرض العناصر التي تقع ضمن المنطقة المرئية من الشاشة فقط، بالإضافة إلى مخزن مؤقت صغير على كل جانب. لا يتم إنشاء العناصر المتبقية في DOM، مما يوفر الذاكرة ويسرع العرض.

عند التمرير، يعيد FlatList استخدام خلايا View المنشأة بالفعل، مستبدلاً بياناتها. هذا يمنع إنشاء آلاف الـ Views لقائمة من 10,000 عنصر. حجم المخزن المؤقت الافتراضي هو 10 عناصر فوق وتحت المنطقة المرئية، لكنه قابل للتكوين عبر windowSize.

المعاملالافتراضيالوصف
windowSize21عدد الصفحات للعرض (صفحة واحدة = ارتفاع الشاشة)
initialNumToRender10عدد العناصر في أول عرض
maxToRenderPerBatch10أقصى عدد عناصر يتم عرضها دفعة واحدة
removeClippedSubviewsfalseإزالة الـ Views خارج الشاشة من التسلسل الهرمي

التكوين الأمثل لهذه المعاملات يسمح بالموازنة بين سلاسة التمرير واستهلاك الذاكرة. للقوائم ذات العناصر الكبيرة، يُوصى بتقليل windowSize إلى 5-7.

API والخصائص الرئيسية لـ FlatList

API FlatList تشمل مجموعة من الخصائص لتكوين عرض وسلوك القائمة. الخاصيتان الإجباريتان هما data (مصفوفة البيانات) و renderItem (دالة عرض العناصر). keyExtractor يحسن الأداء من خلال توفير مفتاح فريد لكل عنصر.

js
import React from 'react';
import { FlatList, View, Text, StyleSheet } from 'react-native';

const App = () => {
  const data = Array.from({ length: 100 }, (_, i) => ({
    id: i.toString(),
    title: `Item #${i + 1}`,
  }));

  return (
    <FlatList
      data={data}
      renderItem={({ item }) => (
        <View style={styles.item}>
          <Text>{item.title}</Text>
        </View>
      )}
      keyExtractor={item => item.id}
      ItemSeparatorComponent={() => <View style={styles.separator} />}
    />
  );
};

ItemSeparatorComponent يضيف فاصلًا بين العناصر، ListHeaderComponent و ListFooterComponent يضيفان رأس وتذييل القائمة. هذا يسمح بإنشاء تخطيطات معقدة دون أغلفة إضافية.

js
const styles = StyleSheet.create({
  item: {
    padding: 16,
    backgroundColor: '#fff',
    borderBottomWidth: 1,
    borderBottomColor: '#e0e0e0',
  },
  separator: {
    height: 1,
    backgroundColor: '#ccc',
  },
});

تحسين أداء FlatList

تحسين FlatList أمر بالغ الأهمية للتطبيقات التي تحتوي على مئات وآلاف العناصر. بدون التكوين الصحيح، قد تبطئ القائمة أثناء التمرير، وتستهلك ذاكرة زائدة، وتتسبب في أعطال على الأجهزة الضعيفة.

القاعدة الأولى هي استخدام keyExtractor بمعرفات فريدة ومستقرة. استخدام الفهارس كمفاتيح يؤدي إلى إعادة استخدام غير صحيحة للخلايا وأخطاء في الحالة. القاعدة الثانية هي تغليف renderItem في useCallback واستخدام React.memo لمكون العنصر.

getItemLayout للارتفاع الثابت

إذا كانت جميع العناصر لها نفس الارتفاع، فإن getItemLayout يسمح لـ FlatList بحساب موضع التمرير دون قياس المكونات. هذا يوفر زيادة كبيرة في الأداء، خاصة عند التمرير إلى فهرس معين.

js
const ITEM_HEIGHT = 80;

const getItemLayout = (data, index) => ({
  length: ITEM_HEIGHT,
  offset: ITEM_HEIGHT * index,
  index,
});

<FlatList
  data={data}
  getItemLayout={getItemLayout}
  renderItem={renderItem}
/FlatList>

useMemo للبيانات يمنع إعادة العرض غير الضرورية. إذا جاءت البيانات من API، قم بتحويلها مرة واحدة وتخزينها مؤقتًا. استخدم React.memo لمكون العنصر لتجنب عرض العناصر غير المتغيرة.

القوائم الأفقية والدوارات

FlatList الأفقي يتم إنشاؤه بإضافة الخاصية horizontal={true}. تغير القائمة اتجاه التمرير إلى المحور X، وهو مناسب لدوارات المنتجات ومعارض الصور والقوائم الأفقية.

في الوضع الأفقي، من المهم تكوين snapToInterval و snapToAlignment بشكل صحيح للتمرير خطوة بخطوة كما في الدوارات الأصلية. يتعامل المكون تلقائيًا مع الزخم ورفع الإصبع، ويتوقف عند أقرب عنصر.

js
<FlatList
  horizontal
  data={images}
  renderItem={renderItem}
  keyExtractor={item => item.id}
  showsHorizontalScrollIndicator={false}
  snapToInterval={CARD_WIDTH + GAP}
  snapToAlignment="start"
  decelerationRate="fast"
  pagingEnabled
  onViewableItemsChanged={onViewableItemsChanged}
/>

onViewableItemsChanged هو استدعاء يُفعّل عندما تتغير العناصر المرئية. يُستخدم للتحليلات والتحميل البطيء للصور وتشغيل الفيديو فقط للبطاقات المرئية.

السحب للتحديث والتحميل اللانهائي

السحب للتحديث في FlatList يُطبّق عبر الخاصيتين refreshing و onRefresh، اللتين تعملان مع حالة التحميل. عند سحب القائمة لأسفل، يتم استدعاء onRefresh، ويقوم علم refreshing بحظر الاستدعاءات المتكررة.

التحميل اللانهائي يُكوّن عبر onEndReached — استدعاء يُفعّل عند الاقتراب من نهاية القائمة. onEndReachedThreshold يحدد عدد العناصر قبل النهاية التي يتم فيها تشغيل الحدث. عادةً ما يُستخدم التقسيم المبني على المؤشر.

js
const ListWithPagination = () => {
  const [data, setData] = React.useState([]);
  const [page, setPage] = React.useState(1);
  const [refreshing, setRefreshing] = React.useState(false);

  const loadMore = React.useCallback(async () => {
    const newData = await fetchPage(page);
    setData(prev => [...prev, ...newData]);
    setPage(p => p + 1);
  }, [page]);

  return (
    <FlatList
      data={data}
      renderItem={renderItem}
      keyExtractor={item => item.id}
      refreshing={refreshing}
      onRefresh={loadMore}
      onEndReached={loadMore}
      onEndReachedThreshold={0.5}
    />
  );
};

هام: قد يتم استدعاء onEndReached عدة مرات. أضف علم isLoading لحظر الطلبات المتكررة حتى ينتهي الطلب السابق. استخدم ActivityIndicator في ListFooterComponent للإشارة إلى التحميل.

الأسئلة المتكررة

ما الفرق بين FlatList و ScrollView؟

FlatList يستخدم التخيل الافتراضي — يعرض العناصر المرئية فقط، مما يوفر الذاكرة مع مجموعات البيانات الكبيرة. ScrollView يعرض جميع العناصر الفرعية مرة واحدة، مناسب فقط للقوائم الصغيرة من 20-30 عنصرًا. FlatList مثالي لـ 100+ عنصر.

كيفية إصلاح الوميض عند تحديث بيانات FlatList؟

يحدث الوميض عندما يتغير مرجع مصفوفة البيانات. استخدم extraData بتمرير التبعية، أو لف renderItem في React.memo. للتحكم الكامل، استخدم useMemo لتثبيت مراجع البيانات.

لماذا لا يتم التمرير في FlatList داخل ScrollView آخر؟

FlatList غير مصمم للتضمين داخل ScrollView بسبب تعارض الإيماءات. الحلول: استخدم FlatList مع nestedScrollEnabled (Android)، SectionList للأقسام، أو انقل التمرير الخارجي إلى FlatList عبر ListHeaderComponent.

كيفية تحريك ظهور العناصر في FlatList؟

استخدم Animated API داخل renderItem مع تأخير بناءً على الفهرس. عند التمرير، استخدم onViewableItemsChanged لتفعيل الرسوم المتحركة. المكتبات react-native-reanimated و react-native-lottie تبسط إنشاء رسوم متحركة معقدة للظهور.

ما هي VirtualizedList وكيف ترتبط بـ FlatList؟

VirtualizedList هو المكون الأساسي للتخيل الافتراضي الذي بُني عليه FlatList و SectionList. FlatList هو غلاف لـ VirtualizedList مع API مبسّط للقوائم المسطحة. VirtualizedList يوفر تحكمًا منخفض المستوى لكن نادرًا ما يُستخدم مباشرة.

الخلاصة

  • FlatList هو المكون الرئيسي في React Native للقوائم عالية الأداء مع التخيل الافتراضي التلقائي وإعادة استخدام الخلايا
  • التخيل الافتراضي يعرض العناصر المرئية فقط عبر windowSize و initialNumToRender، مما يوفر الذاكرة في مجموعات البيانات الكبيرة
  • الخصائص الإجبارية: data و renderItem و keyExtractor — تضمن التشغيل الصحيح للقائمة
  • getItemLayout يسرع التمرير للعناصر ذات الارتفاع الثابت، متخلصًا من القياس الديناميكي
  • القوائم الأفقية والدوارات تُكوّن عبر horizontal و snapToInterval للتمرير خطوة بخطوة
  • السحب للتحديث و onEndReached يطبقان التحميل اللانهائي مع حماية ضد الاستدعاءات المتكررة
  • React.memo و useCallback إجباريان لـ renderItem — بدونها، كل تمرير يسبب إعادة عرض جميع العناصر

سنقوم بتطوير تطبيق جوال جاهز

تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.

مناقشة المشروع

اقرأ أيضًا