الفرق بين المراجعتين لصفحة: «ReactNative/virtualizedlist»

من موسوعة حسوب
رفع المحتوى
 
طلا ملخص تعديل
 
(5 مراجعات متوسطة بواسطة 3 مستخدمين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:المكون VirtualizedList في ReactNative}}</noinclude>
<noinclude>{{DISPLAYTITLE:المكون VirtualizedList في ReactNative}}</noinclude>
إذا أردت أن تتحصل على مرونة أكبر من التي يوفرها المكونان [https://wiki.hsoub.com/ReactNative/flatlist <code><FlatList></code>] و[https://wiki.hsoub.com/ReactNative/sectionlist <code><SectionList></code>] لطريقة عرض القوائم، فعليك استخدام المكون <code>VirtualizedList</code> والذي يوفر عناصر البناء الرئيسية لعرض القوائم. على سبيل المثال للاستخدام مع البيانات الغير قابلة للتعديل بدلًا عن المصفوفات العادية.
إذا أردت أن تتحصل على مرونة أكبر من التي يوفرها المكونان <code>[[ReactNative/flatlist|<FlatList>]]</code> و<code>[[ReactNative/sectionlist|<SectionList>]]</code> لطريقة عرض القوائم، فعليك استخدام المكون <code>VirtualizedList،</code> والذي يوفّر عناصر البناء الرئيسية لعرض القوائم. للاستخدام مع البيانات الغير قابلة للتعديل بدلًا عن المصفوفات العادية على سبيل المثال.


لهذا المكون فوائد عديدة حيث أنه يقلل استهلاك الذاكرة ويحسن أداء القوائم بشكل كبير من خلال الحفاظ على نافذة عرض محدودة للعناصر النشطة، ويستبدل العناصر الموجودة خارج هذه النافذة بمساحات فارغة بأحجام مناسبة. ويتم عرض العناصر تتابعيًا عند التمرير لأسفل في الشاشة.
لهذا المكوّن فوائد عديدة حيث أنه يقلّل استهلاك الذاكرة ويحسِّن أداء القوائم كثيرًا من خلال الحفاظ على نافذة عرض محدودة للعناصر النشطة، ويستبدل العناصر الموجودة خارج هذه النافذة بمساحات فارغة بأحجام مناسبة. ويتم عرض العناصر تتابعيًا عند التمرير لأسفل في الشاشة، إذ تُعرض (تصير) العناصر البعيدة عن مجال الرؤية أو العرض بأسلوب أداء منخفض low-pri (قبل تشغيل أي تفاعلات) أو إن كانت قريب من مجال الرؤية، فتعرض بأسلوب أداء مرتفع hi-pri وكل ذلك لتقليل أي احتمال برؤية مسافة فارغة.


'''مثال'''
== مثال ==
 
إليك المثال التالية ([https://snack.expo.dev/@hsoubwiki/virtualizedlistexample تجربة حية]):<syntaxhighlight class="react" lang="javascript">import React from 'react';
<syntaxhighlight class="react">import React from 'react';
import { SafeAreaView, View, VirtualizedList, StyleSheet, Text, StatusBar } from 'react-native';
import { SafeAreaView, View, VirtualizedList, StyleSheet, Text } from 'react-native';
import Constants from 'expo-constants';


const DATA = [];
const DATA = [];


const getItem = (data, index) => {
const getItem = (data, index) => ({
   return {
   id: Math.random().toString(12).substring(0),
    id: Math.random().toString(12).substring(0),
  title: `Item ${index+1}`
    title: `Item ${index+1}`
});
  }
}


const getItemCount = (data) => {
const getItemCount = (data) => 50;
  return 50;
}


const Item = ({ title })=> {
const Item = ({ title }) => (
   return (
   <View style={styles.item}>
    <View style={styles.item}>
    <Text style={styles.title}>{title}</Text>
      <Text style={styles.title}>{title}</Text>
  </View>
    </View>
);
  );
}


const VirtualizedListExample = () => {
const App = () => {
   return (
   return (
     <SafeAreaView style={styles.container}>
     <SafeAreaView style={styles.container}>
سطر 49: سطر 41:
   container: {
   container: {
     flex: 1,
     flex: 1,
     marginTop: Constants.statusBarHeight,
     marginTop: StatusBar.currentHeight,
   },
   },
   item: {
   item: {
سطر 64: سطر 56:
});
});


export default VirtualizedListExample;</syntaxhighlight>
export default App;</syntaxhighlight>
 


'''ملاحظات'''
'''ملاحظات'''
سطر 71: سطر 62:
* عند تمرير المحتوى خارج نافضة العرض، لا يحتفظ المكون <code>VirtualizedList</code> بالحالة الخاصة به، لذلك يجب التأكد من حفظها في مخزن خارجي للبيانات مثل <code>Flux</code> أو <code>Redux</code> أو <code>Relay</code>.
* عند تمرير المحتوى خارج نافضة العرض، لا يحتفظ المكون <code>VirtualizedList</code> بالحالة الخاصة به، لذلك يجب التأكد من حفظها في مخزن خارجي للبيانات مثل <code>Flux</code> أو <code>Redux</code> أو <code>Relay</code>.
* يعتبر هذا المكون <code>PureComponent</code>، أي أنه لن يعاد رسمه إذا كانت الخاصيَّات متساوية تساويًا سطحيًا (shallow-equal). لذلك يجب التأكد من أن جميع الخاصيات التي تعتمد الدالة <code>renderItem</code> عليها قد تم تمريرها كمعاملات لا تساوي قيمتها قيمة الخاصيَّات الحالية للتأكد من تحديث واجهة المستخدم عند تغيير البيانات.
* يعتبر هذا المكون <code>PureComponent</code>، أي أنه لن يعاد رسمه إذا كانت الخاصيَّات متساوية تساويًا سطحيًا (shallow-equal). لذلك يجب التأكد من أن جميع الخاصيات التي تعتمد الدالة <code>renderItem</code> عليها قد تم تمريرها كمعاملات لا تساوي قيمتها قيمة الخاصيَّات الحالية للتأكد من تحديث واجهة المستخدم عند تغيير البيانات.
* يُعرض المحتوى بشكل غير متزامن خارج نافذة العرض،وذلك للحفاظ على مساحة الذاكرة وضمان التمرير السلس، هذا يعي أنه من الممكن ظهور مساحات فارغة للحظات بسيطه قبل ظهور المحتوى عند التمرير بسرعة عالية. ونعمل على تحسين هذا السلوك خلف الكواليس.
* يُعرض المحتوى بطريقة غير متزامنة خارج نافذة العرض، وذلك للحفاظ على مساحة الذاكرة وضمان التمرير السلس، هذا يعي أنه من الممكن ظهور مساحات فارغة للحظات بسيطه قبل ظهور المحتوى عند التمرير بسرعة عالية. ونعمل على تحسين هذا السلوك خلف الكواليس.
* بشكل إفتراضي، يبحث المكون <code>VirtualizedList</code> عن الخاصية <code>key</code> في كل عنصر من العناصر الأبناء.
* يبحث المكون <code>VirtualizedList</code> افتراضيًا عن الخاصية <code>key</code> في كلّ عنصر من العناصر الأبناء.


__toc__
__toc__
سطر 78: سطر 69:
== الخاصيات ==
== الخاصيات ==


يرث خواص المكون [https://reactnative.dev/docs/scrollview#props <code>ScrollView</code>].
يرث خواص المكون <code>[[ReactNative/scrollview#الخاصيات|ScrollView]]</code>.
 
=== <code>data</code> ===
=== <code>renderItem</code> ===


<syntaxhighlight class="react">(info: any) => ?React.Element<any></syntaxhighlight>
مصفوفة من الأصناف يمثِّل كلّ صنف أحد العناصر التي ستُعرض في القائمة، ويكون كلّ صِنف في الشكل <code>{key: string}</code> افتراضيًا، ويمكن استخدام الخاصيِّات <code>getItem</code> و<code>getItemCount</code> و<code>keyExtractor</code> للتعامل مع جميع انواع البيانات المُرتبة.
تأخذ عنصر من <code>data</code> وتعرضه في القائمة.


{| class="wikitable"
{| class="wikitable"
سطر 89: سطر 78:
! مطلوب
! مطلوب
|-
|-
| دالة (function)
| أي نوع <any>
| نعم
| نعم
|}
|}
=== <code>getItem</code> ===


 
<syntaxhighlight class="react" lang="javascript">(data: any, index: number) => object;</syntaxhighlight>
 
دالة تمكِّنك من الوصول لعنصر معين من العناصر المحفوظة في الخاصية <code>data</code> إن كانت بياناتها خام blob.
=== <code>data</code> ===
 
. مصفوفة من الأصناف يمثل كل صنف أحد العناصر التي ستُعرض في القائمة. ويكون كل صِنف في الشكل <code>{key: string}</code> افتراضيًا، ومن الممكن استخدام الخاصيِّات <code>getItem</code> و <code>getItemCount</code> و <code>keyExtractor</code> للتعامل مع جميع انواع البيانات المُرتبة.


{| class="wikitable"
{| class="wikitable"
سطر 103: سطر 90:
! مطلوب
! مطلوب
|-
|-
| <any>
| دالة (function)
| نعم
| نعم
|}
|}
=== <code>getItemCount</code> ===


 
<syntaxhighlight class="react" lang="javascript">(data: any) => number;</syntaxhighlight>
 
تحسب عدد العناصر الموجودة في البيانات الخام <code>data</code>.
=== <code>getItem</code> ===
 
<syntaxhighlight class="react">(data: any, index: number) => object;</syntaxhighlight>
دالة تمكنك من الوصول لعنصر معين من العناصر المحفوظة في الخاصية <code>data</code>.


{| class="wikitable"
{| class="wikitable"
سطر 122: سطر 106:
|}
|}


 
=== <code>renderItem</code> ===
 
<syntaxhighlight class="react" lang="javascript">(info: any) => ?React.Element<any></syntaxhighlight>
=== <code>getItemCount</code> ===
تأخذ عنصر من <code>data</code> وتعرضه في القائمة.
 
<syntaxhighlight class="react">(data: any) => number;</syntaxhighlight>
تحسب عدد العناصر الموجودة في المصفوفة <code>data</code>.


{| class="wikitable"
{| class="wikitable"
سطر 136: سطر 117:
| نعم
| نعم
|}
|}
===<code>CellRendererComponent</code>===


تُعرض جميع الخلايا بواسطة هذا العنصر. وقد يكون <code>React Component Class</code> أو <code>render function</code>.


 
والقيمة الإفتراضية له هي المكون <code>[[ReactNative/view|View]]</code>.
=== <code>debug</code> ===
 
يظهر المزيد من التفاصيل عن الأخطاء التي تحدث أثناء التعامل مع المكون <code>VirtulizedList</code> مما يسهل عملية تصحيح الأخطاء (debugging).


{| class="wikitable"
{| class="wikitable"
سطر 147: سطر 127:
! مطلوب
! مطلوب
|-
|-
| قيمة منطقية (bool)
| مكون component، دالة function
| لا
| لا
|}
|}
===<code>ItemSeparatorComponent</code>===


يعرض هذا المكوّن فواصلًا بين العناصر، ويمتلك الخاصيتين <code>highlighted</code> و<code>leadingItem</code> إفتراضيًّا.


 
توفِّر الخاصية <code>renderItem</code> الخواص <code>separators.highlight</code> و<code>separators.unhighlight</code> واللتان تُستعملان لتحديث قيمة الخاصية <code>highlighted</code>. يمكن أيضًا إضافة خواص أخرى عن طريق الخاصية <code>separators.updateProps</code>.
=== <code>extraData</code> ===
 
تجبر هذه الخاصية الجهاز على إعادة رسم القائمة عند تغير أي بيانات داخل القائمة. إذا كان هناك عنصر من العناصر التي ستعرض بواسطة الدالة <code>renderItem</code> يعتمد على بيانات تم تعريفها خارج الخاصية <code>data</code>، ينبغي إعادة تعريف هذه البيانات داخلها.


{| class="wikitable"
{| class="wikitable"
سطر 161: سطر 140:
! مطلوب
! مطلوب
|-
|-
| قيمة منطقية (bool)
| مكون component، دالة function
| لا
| لا
|}
|}
===<code>listEmptyComponent</code>===


يُعرض هذا المكون عندما تكون القائمة فارغة، ويمكن أن يكون مكون React (مثل <code>SomeComponent</code>) أو عنصر React (مثل <code><SomeComponent /‎></code>).


=== <code>getItemLayout</code> ===
<syntaxhighlight class="react">(
    data: any,
    index: number,
  ) => {length: number, offset: number, index: number}</syntaxhighlight>
{| class="wikitable"
{| class="wikitable"
! النوع
! النوع
! مطلوب
! مطلوب
|-
|-
| دالة (function)
| مكون component، عنصر element
| لا
| لا
|}
|}
===<code>ListItemComponent</code>===


 
مكون يُستخدم لعرض عناصر القائمة، وقد يكون مكون صنف (Class component) أو دالة عرض (تصيير).
 
=== <code>initialScrollIndex</code> ===
 
بدلًا عن عرض أول عنصر في أعلى القائمة، تحدد هذه الخاصية ترتيب العنصر الذي يجب بدء عرضه في بداية القائمة، وذلك عن طريق ايقاف تحسين التمرير الى الأعلى الذي يحافظ على عرض عناصر <code>initialNumToRender</code> ويعرض العناصر ابتداءً من أول عنصر في الترتيب. وتتطلب هذه الخاصية أن تكون الخاصية <code>getItemLayout</code> مفعلة.
 
{| class="wikitable"
{| class="wikitable"
! النوع
! النوع
! مطلوب
! مطلوب
|-
|-
| عدد (number)
| مكون component، دالة function
| لا
| لا
|}
|}
===<code>ListFooterComponent</code>===


 
يُعرض في أسفل القائمة (تذييل للقائمة)، ويمكن أن يكون مكون React (مثل <code>SomeComponent</code>) أو عنصر React (مثل <code><SomeComponent /‎></code>).
 
=== <code>inverted</code> ===
 
تعكس إتجاه التمرير باستخدام تحويلات بمقياس (-1).


{| class="wikitable"
{| class="wikitable"
سطر 205: سطر 172:
! مطلوب
! مطلوب
|-
|-
| دالة (function)
| مكون component، عنصر element
| لا
| لا
|}
|}
===<code>ListFooterComponentStyle</code>===


 
تُحدد أنماط المكوّن <code>ListFooterComponent</code>.
 
=== <code>CellRendererComponent</code> ===
 
تُعرض جميع الخلايا بواسطة هذا العنصر. ويمكن أن يكون <code>React Component Class</code> أو <code>render function</code>.
 
والقيمة الإفتراضية له هي المكون <code>View</code>.


{| class="wikitable"
{| class="wikitable"
سطر 221: سطر 183:
! مطلوب
! مطلوب
|-
|-
| component, function
| خاصيات [[ReactNative/view style props|ViewStyle]]
| لا
| لا
|}
|}
===<code>ListHeaderComponenet</code>===


 
يُُعرض في أعلى القائمة، وr$ ويمكن أن يكون مكون React (مثل <code>SomeComponent</code>) أو عنصر React (مثل <code><SomeComponent /></code>).
 
=== <code>ItemSeparatorComponent</code> ===
 
يعرض هذا المكون فواصل بين العناصر. ويمتلك الخاصيتين <code>highlighted</code> و <code>leadingItem</code> بشكل إفتراضي.
 
توفر الخاصية <code>renderItem</code> الخواص <code>separators.highlight</code> و <code>separators.unhighlight</code> و اللتان تستعملان لتحديث قيمة الخاصية <code>highlighted</code>. يمكن أيضًا إضافة خواص أخرى عن طريق الخاصية <code>separators.updateProps</code>.
 
{| class="wikitable"
{| class="wikitable"
! النوع
! النوع
! مطلوب
! مطلوب
|-
|-
| component, function
| مكون component، عنصر element
| لا
| لا
|}
|}
===<code>ListHeaderComponenetStyle</code>===


 
تُحدد أنماط المكون <code>ListHeaderCompoenet</code>.
 
=== <code>listKey</code> ===
 
إذا كان هناك أكثر من قائمة في نفس المستوى (أبناء لعنصر واحد) يجب تحديد مفتاح مميز لكل قائمة.


{| class="wikitable"
{| class="wikitable"
سطر 251: سطر 204:
! مطلوب
! مطلوب
|-
|-
| سلسلة نصية (string)
| خاصيات [[ReactNative/view style props|ViewStyle]]
| لا
| لا
|}
|}


 
=== <code>debug</code> ===
 
يظهر المزيد من التفاصيل عن الأخطاء التي تحدث أثناء التعامل مع المكون <code>VirtulizedList</code> مما يسهل عملية تصحيح الأخطاء (debugging).
=== <code>listEmptyComponent</code> ===
 
يُعرض هذا المكون عندما تكون القائمة فارغة، ويمكن أن يكون مكوِّن صنفي (Class component) أو مكون دالِّي (function componenet) أو عنصر.


{| class="wikitable"
{| class="wikitable"
سطر 265: سطر 215:
! مطلوب
! مطلوب
|-
|-
| component، function، element
| قيمة منطقية (bool)
| لا
| لا
|}
|}


 
=== <code>disableVirtualization</code> ===
 
'''خاصية مهملة''': توفِّر المحاكاة الافتراضية تحسينات كبيرة في الأداء والذاكرة إلَّا أنها تلغي تمامًا حالات التفاعل الموجودة خارج نافذة العرض، حيث يجب تعطيل هذه الخاصية فقط أثناء بناء التطبيق وتصحيح الأخطاء.
=== <code>ListItemComponent</code> ===
 
مكون يستخدم لعرض عناصر القائمة، ويمكن أن يكون مكون كائني (Class component) أو دالة عرض.
 
 


{| class="wikitable"
{| class="wikitable"
سطر 281: سطر 226:
! مطلوب
! مطلوب
|-
|-
| component, function
| قيمة منطقية (bool)
| لا
| لا
|}
|}
=== <code>extraData</code> ===


 
تجبر هذه الخاصية الجهاز على إعادة رسم القائمة عند تغير أي بيانات داخل القائمة. إذا كان هناك عنصر من العناصر التي ستعرض بواسطة الدالة <code>renderItem</code> يعتمد على بيانات تم تعريفها خارج الخاصية <code>data</code>، ينبغي إعادة تعريف هذه البيانات داخلها.
 
=== <code>ListFooterComponent</code> ===
 
يُعرض في أسفل القائمة (تذييل للقائمة)،ويمكن أن يكون مكوِّن صنفي (Class component) أو مكون دالِّي (function componenet) أو عنصر.


{| class="wikitable"
{| class="wikitable"
سطر 295: سطر 237:
! مطلوب
! مطلوب
|-
|-
| component، function، element
| قيمة منطقية (bool)
| لا
| لا
|}
|}
=== <code>getItemLayout</code> ===


 
<syntaxhighlight class="react" lang="javascript">(
 
    data: any,
=== <code>ListFooterComponentStyle</code> ===
    index: number,
 
  ) => {length: number, offset: number, index: number}</syntaxhighlight>
تُحدد أنماط المكون <code>ListFooterComponent</code>.
 
{| class="wikitable"
{| class="wikitable"
! النوع
! النوع
! مطلوب
! مطلوب
|-
|-
| ViewStylePop
| دالة (function)
| لا
| لا
|}
|}


 
=== <code>horizontal</code> ===
 
إن كانت true، فستعرض عناصر القائمة بجانب بعضها بعضًا أفقيًا بدلًا من عرضها فوق بعضها شاقوليًا.
=== <code>ListHeaderComponenet</code> ===
 
يُُعرض في أعلى القائمة، ويمكن أن يكون مكوِّن صنفي (Class component) أو مكون دالِّي (function componenet).
 
 
 
{| class="wikitable"
{| class="wikitable"
! النوع
! النوع
! مطلوب
! مطلوب
|-
|-
| component، function، element
| قيمة منطقية (bool)
| لا
| لا
|}
|}


=== <code>initialNumToRender</code> ===
تُحدد عدد العناصر التي ستُعرض في أول دفعة. يجب أن يكون عدد العناصر كافي لملء الشاشة أو أقل من ذلك ولكن يجب أن لا يزيد عن حجم الشاشة.


 
'''ملاحظة''': لتحسين عملية التمرير لأعلى (Scroll-to-top) يجب ألّا تُحذف هذه العناصر كجزء من إطارات العرض.
=== <code>ListHeaderComponenetStyle</code> ===
 
تُحدد أنماط المكون <code>ListHeaderCompoenet</code>.


{| class="wikitable"
{| class="wikitable"
سطر 339: سطر 273:
! مطلوب
! مطلوب
|-
|-
| component، function، element
| عدد (number)
| لا
| لا
|}
|}
=== <code>initialScrollIndex</code> ===


 
بدلًا عن عرض أول عنصر في أعلى القائمة، تحدِّد هذه الخاصية ترتيب العنصر الذي يجب بدء عرضه في بداية القائمة، وذلك عن طريق ايقاف تحسين التمرير الى الأعلى الذي يحافظ على عرض عناصر <code>initialNumToRender</code> ويُعرض العناصر ابتداءً من أول عنصر في الترتيب، وتتطلّب هذه الخاصية أن تكون الخاصية <code>getItemLayout</code> مفعّلة.
 
=== <code>onRefresh</code> ===
 
<syntaxhighlight class="react">() => void</syntaxhighlight>
توفر <code>RefreshControl</code> قياسي يُضاف لوظيفة السحب للتحديث (Pull to Refresh)، وعند استخدامها يجب التأكد من ضبط الخاصية <code>refreshing</code> بشكل صحيح.


{| class="wikitable"
{| class="wikitable"
سطر 354: سطر 284:
! مطلوب
! مطلوب
|-
|-
| دالة (funcion)
| عدد (number)
| لا
| لا
|}
|}
=== <code>inverted</code> ===


تعكس إتجاه التمرير باستخدام تحويلات بمقياس (-1).


=== <code>onScrollToIndexFailed</code> ===
دالة تُستدعى في حالة حدوث خطأ عند التمرير لعنصر معين، فإمّا أن تحسب الإزاحة الخاصة بالعنصر الذي حدث الخطأ عند التمرير إليه وإعادة التمرير إليها مرة أخرى، أو التمرير لنهاية القائمة ثم الرجوع لذلك العنصر.
<syntaxhighlight class="react">(info: {
    index: number,
    highestMeasuredFrameIndex: number,
    averageItemLength: number,
  }) => void</syntaxhighlight>
{| class="wikitable"
{| class="wikitable"
! النوع
! النوع
! مطلوب
! مطلوب
|-
|-
| دالة (funcion)
| دالة (function)
| لا
| لا
|}
|}


 
=== <code>listKey</code> ===
 
مُعرِّف فريد للقائمة، وإذا كان هناك أكثر من قائمة في نفس المستوى (أبناء لعنصر واحد) متفرعة من قائمة أخرى، فيجب تحديد مفتاح مميز لكلّ قائمة لتُعرض القوائم وتعمل بشكل صحيح.
=== <code>onViewableItemsChanged</code> ===
 
<syntaxhighlight class="react">(info: {
    viewableItems: array,
    changed: array,
  }) => void</syntaxhighlight>
دالة تُستدعى عندما تتغير الصفوف المعروضة، كما هي مُعرَّفة بالخاصية <code>ViewabilityConfig</code>.


{| class="wikitable"
{| class="wikitable"
سطر 391: سطر 306:
! مطلوب
! مطلوب
|-
|-
| دالة (funcion)
| سلسلة نصية (string)
| لا
| لا
|}
|}


 
=== <code>keyExtractor</code> ===
 
<syntaxhighlight class="react" lang="javascript">(item: object, index: number) => string;</syntaxhighlight>
=== <code>refreshing</code> ===
تُستخدم للحصول على مفتاح عنصر ذو ترتيب معيّن في القائمة. يستخدم المفتاح للتخزين المؤقت (Caching) و على أساس مفتاح لتتبع ترتيب العناصر. يتحقق مُستخرج المفاتيح الافتراضي من <code>item.key</code>، ثم يرجع لاستخدام الترتيب، مثل ما يحدث في [[React]] تمامًا.
 
اعطي هذه الخاصية القيمة <code>true</code> أثناء إنتظار تحميل بيانات جديدة.


{| class="wikitable"
{| class="wikitable"
سطر 405: سطر 318:
! مطلوب
! مطلوب
|-
|-
| قيمة منطقية (bool)
| دالة (function)
| لا
| لا
|}
|}


 
=== <code>maxToRenderPerBatch</code> ===
 
تُحدد أقصى عدد من العناصر يمكن عرضه في الدفعة الواحدة، وكلما زاد هذا العدد ستحصل على معدل ملء شاشة أفضل، ولكن قد يتأثر تجاوب التطبيق مع أحجام الشاشات المختلفة (responsiveness) بسبب تداخل المحتوى المعروض عند الضغط على الأزرار أو التفاعلات الأخرى.
=== <code>refreshControl</code> ===
 
عنصر يستخدم للتحكم في طريقة تحديث عناصر القائمة، ويستبدل المكون <code><RefreshControl></code> الأصلي، وعند استخدامة يتم تجاهل الخاصيتين <code>onRefreshing</code> و <code>refreshing</code>.
 
'''ملاحظة''': يعمل فقط مع المكون <code>VirtualizedList</code> عندما تكون القائمة رأسية.


{| class="wikitable"
{| class="wikitable"
سطر 421: سطر 329:
! مطلوب
! مطلوب
|-
|-
| element
| عدد (number)
| لا
| لا
|}
|}
===<code>onEndReached</code>===


دالة تستدعى عند الوصول للموقع المحدَّد بالخاصية <code>onEndReachedThreshold</code> في المحتوى المعروض.


 
<syntaxhighlight class="react" lang="javascript">(info: {distanceFromEnd: number}) => void;</syntaxhighlight>
=== <code>removeClippedSubviews</code> ===
 
تستخدم لتحسين عملية التمرير في القوائم الطويلة.
 
'''ملاحظة''': قد تحتوي على أخطاء (محتوى مفقود) في بعض الحالات - استخدمها على مسؤوليتك الخاصة.
 
{| class="wikitable"
{| class="wikitable"
! النوع
! النوع
! مطلوب
! مطلوب
|-
|-
| قيمة منطقية (bool)
| دالة (function)
| لا
| لا
|}
|}
===<code>onEndReachedThreshold</code>===


 
تُحدد إلى أيّ مدى يجب أن تكون الحافة السفلية للقائمة بعيدة من نهاية المحتوى (بوحدات الطول المرئي للقائمة) لتشغيل رد النداء <code>onEndReached</code>.  فالقيمة 0.5 على سبيل المثال ستُشغل ردّ النداء <code>onEndReached</code> عندما تكون نهاية المحتوى في حدود نصف الطول المرئي للقائمة.
 
=== <code>renderScrollComponent</code> ===
 
<syntaxhighlight class="react">(props: object) => element;</syntaxhighlight>
تعرض عنصر تمرير (scroll element) مخصص، على سبيل المثال <code><RefreshControl></code> ذو أنماط مختلفة.


{| class="wikitable"
{| class="wikitable"
سطر 452: سطر 352:
! مطلوب
! مطلوب
|-
|-
| دالة (function)
| عدد (number)
| لا
| لا
|}
|}
===<code>onRefresh</code>===


 
<syntaxhighlight class="react" lang="javascript">() => void</syntaxhighlight>
 
توفِّر <code>RefreshControl</code> قياسي يُضاف لوظيفة السحب للتحديث (Pull to Refresh)، وعند استخدامها يجب التأكد من ضبط الخاصية <code>refreshing</code> بطريقة صحيحة.
=== <code>viewabilityConfig</code> ===
 
أنظر [https://gist.github.com/sahrens/634233c57ef6c2cb694a <code>ViewabilityHelper.js</code>] لمزيد من المعلومات.  


{| class="wikitable"
{| class="wikitable"
سطر 466: سطر 364:
! مطلوب
! مطلوب
|-
|-
| ViewabilityConfig
| دالة (funcion)
| لا
| لا
|}
|}
=== <code>onScrollToIndexFailed</code> ===


دالة تُستدعى في حالة حدوث خطأ عند التمرير لعنصر معين، فإمّا أن تحسب الإزاحة الخاصة بالعنصر الذي حدث الخطأ عند التمرير إليه وإعادة التمرير إليها مَرةً أخرى، أو التمرير لنهاية القائمة ثم الرجوع لذلك العنصر.


 
<syntaxhighlight class="react" lang="javascript">(info: {
=== <code>viewabilityConfigCallbackPairs</code> ===
    index: number,
 
    highestMeasuredFrameIndex: number,
قائمة من أزواج، يتكون كل زوج من المكونين <code>ViewabilityConfig</code> و <code>onViewableItemsChanged</code>. تُستدعى الدالة <code>onViewableItemsChanged</code> من زوج معين عندما يتم استيفاء شروطها المحددة في الخاصية <code>ViewabilityConfig</code> في نفس الزوج.
    averageItemLength: number,
 
  }) => void</syntaxhighlight>
{| class="wikitable"
{| class="wikitable"
! النوع
! النوع
! مطلوب
! مطلوب
|-
|-
| array of ViewabilityConfigCallbackPair
| دالة (funcion)
| لا
| لا
|}
|}
 
=== <code>onViewableItemsChanged</code> ===
 
دالة تُستدعى عندما تتغير الصفوف المعروضة، كما هي مُعرَّفة بالخاصية <code>ViewabilityConfig</code>.<syntaxhighlight class="react" lang="javascript">(info: {
 
    viewableItems: array,
=== <code>horizontal</code> ===
    changed: array,
  }) => void</syntaxhighlight>


{| class="wikitable"
{| class="wikitable"
سطر 492: سطر 393:
! مطلوب
! مطلوب
|-
|-
| قيمة منطقية (bool)
| دالة (funcion)
‎(callback: { changed: array of [[ReactNative/viewtoken|ViewTokens]], viewableItems: array of [[ReactNative/viewtoken|ViewTokens]] }) => void
| لا
| لا
|}
|}


 
=== <code>persistentScrollbar</code> ===
 
=== <code>initialNumToRender</code> ===
 
تُحدد عدد العناصر التي ستُعرض في أول دفعة. يجب أن يكون عدد العناصر كافي لملء الشاشة أو أقل من ذلك ولكن يجب أن لا يزيد عن حجم الشاشة.
 
'''ملاحظة''': لتحسين عملية التمرير لأعلى (Scroll-to-top) يجب ألّا تُحذف هذه العناصر كجزء من إطارات العرض.
 
{| class="wikitable"
{| class="wikitable"
! النوع
! النوع
! مطلوب
! مطلوب
|-
|-
| عدد (number)
| قيمة منطقية (bool)
| لا
| لا
|}
|}
===<code>progressViewOffset</code>===


 
اضبط قيمة هذه الخاصية إذا كنت تحتاج لمساحة لعرض مؤشر التحميل.
 
=== <code>keyExtractor</code> ===
 
<syntaxhighlight class="react">(item: object, index: number) => string;</syntaxhighlight>
تُستخدم للحصول على مفتاح عنصر ذو ترتيب معين في القائمة. يستخدم المفتاح للتخزين المؤقت (Caching) و كمفتاح لتتبع ترتيب العناصر. يتحقق مُستخرج المفاتيح الافتراضي من <code>item.key</code>، ثم يرجع لاستخدام الترتيب، مثل ما يحدث في React تمامًا.


{| class="wikitable"
{| class="wikitable"
سطر 523: سطر 414:
! مطلوب
! مطلوب
|-
|-
| دالة (function)
| عدد
| لا
| لا
|}
|}
=== <code>refreshing</code> ===


 
اعطي هذه الخاصية القيمة <code>true</code> أثناء إنتظار تحميل بيانات جديدة.
 
=== <code>maxToRenderPerBatch</code> ===
 
تُحدد أقصى عدد من العناصر يمكن عرضه في الدفعة الواحدة، وكلما زاد هذا العدد ستحصل على معدل ملء شاشة أفضل، ولكن قد يتأثر تجاوب التطبيق مع أحجام الشاشات المختلفة (responsiveness) بسبب تداخل المحتوى المعروض عند الضغط على الأزرار أو التفاعلات الأخرى.


{| class="wikitable"
{| class="wikitable"
سطر 537: سطر 425:
! مطلوب
! مطلوب
|-
|-
| عدد (number)
| قيمة منطقية (bool)
| لا
| لا
|}
|}
=== <code>refreshControl</code> ===


عنصر يستخدم للتحكم في طريقة تحديث عناصر القائمة، ويستبدل المكون <code><RefreshControl></code> الأصلي، وعند استخدامة يتم تجاهل الخاصيتين <code>onRefreshing</code> و<code>refreshing</code>.


'''ملاحظة''': يعمل فقط مع المكوّن <code>VirtualizedList</code> عندما تكون القائمة رأسية.


=== <code>onEndReached</code> ===
دالة تستدعى عند الوصول للموقع المحدد بالخاصية <code>onEndReachedThreshold</code> في المحتوى المعروض.
<syntaxhighlight class="react">(info: {distanceFromEnd: number}) => void;</syntaxhighlight>
{| class="wikitable"
{| class="wikitable"
! النوع
! النوع
! مطلوب
! مطلوب
|-
|-
| دالة (function)
| عنصر element
| لا
| لا
|}
|}
=== <code>removeClippedSubviews</code> ===


تُستخدم لتحسين عملية التمرير في القوائم الطويلة.


 
'''ملاحظة''': قد تحتوي على أخطاء (محتوى مفقود) في بعض الحالات - استخدمها على مسؤوليتك الخاصة-.
=== <code>onEndReachedThreshold</code> ===
 
تُحدد إلى أي مدى يجب أن تكون الحافة السفلية للقائمة بعيدة من نهاية المحتوى (بوحدات الطول المرئي للقائمة) لتشغيل رد النداء <code>onEndReached</code>. على سبيل المثال فإن القيمة 0.5 ستُشغل رد النداء <code>onEndReached</code> عندما تكون نهاية المحتوى في حدود نصف الطول المرئي للقائمة.


{| class="wikitable"
{| class="wikitable"
سطر 566: سطر 451:
! مطلوب
! مطلوب
|-
|-
| رثم (number)
| قيمة منطقية (bool)
| لا
| لا
|}
|}
=== <code>renderScrollComponent</code> ===


 
<syntaxhighlight class="react" lang="javascript">(props: object) => element;</syntaxhighlight>
 
تعرض عنصر تمرير (scroll element) مخصَّص، على سبيل المثال <code>RefreshControl</code> ذو أنماط مختلفة.
=== <code>updateCellsBatchingPeriod</code> ===
 
تُحدد المدة الزمنية بين عرض دفعات العناصر.


{| class="wikitable"
{| class="wikitable"
سطر 580: سطر 463:
! مطلوب
! مطلوب
|-
|-
| رثم (number)
| دالة (function)
| لا
| لا
|}
|}
=== <code>viewabilityConfig</code> ===


 
انظر [https://gist.github.com/sahrens/634233c57ef6c2cb694a <code>ViewabilityHelper.js</code>] لمزيد من المعلومات.  
 
=== <code>windowSize</code> ===
 
تُحدد الحد الأقصى من العناصر التي يمكن عرضها خارج المنطقة المرئية. على سبيل المثال إذا كانت القائمة تملأ الشاشة، فإن الخاصية <code>windowSize=21</code> ستعرض كامل القائمة (المنطقة المرئية) بالإضافة لمساحة 10 شاشات فارغة أعلى القائمة و 10 أسفلها.
 
'''ملاحظة''': القيم الصغيرة لهذه الخاصية تؤدي لتقليل استهلاك الذاكرة وتحسين الأداء، ولكنها تزيد من احتمالية ظهور مساحات فارغة عند التمرير بسرعة كبيرة.


{| class="wikitable"
{| class="wikitable"
سطر 596: سطر 474:
! مطلوب
! مطلوب
|-
|-
| رثم (number)
| <code>ViewabilityConfig</code>
| لا
| لا
|}
|}
=== <code>viewabilityConfigCallbackPairs</code> ===


 
قائمة من أزواج، يتكون كل زوج من المكونين <code>ViewabilityConfig</code> و <code>onViewableItemsChanged</code>. تُستدعى الدالة <code>onViewableItemsChanged</code> من زوج معين عندما يتم استيفاء شروطها المحددة في الخاصية <code>ViewabilityConfig</code> في نفس الزوج.
 
=== <code>disableVirtualization</code> ===
 
'''خاصية مهملة''': توفر المحاكاة الافتراضية تحسينات كبيرة في الأداء والذاكرة إلَّا أنها تلغي تمامًا حالات التفاعل الموجودة خارج نافذة العرض. يجب تعطيل هذه الخاصية فقط أثناء بناء التطبيق وتصحيح الأخطاء.


{| class="wikitable"
{| class="wikitable"
سطر 610: سطر 485:
! مطلوب
! مطلوب
|-
|-
|  
| مصوفة من الكائن ViewabilityConfigCallbackPair
| لا
| لا
|}
|}
===<code>updateCellsBatchingPeriod</code>===


 
تُحدد المدة الزمنية بين عرض دفعات العناصر بعيدة الرؤية في الوضع low-pri لعرض هذه العناصر. تشبه إلى حد ما <code>maxToRenderPerBatch</code>.
 
=== <code>persistentScrollbar</code> ===


{| class="wikitable"
{| class="wikitable"
سطر 622: سطر 496:
! مطلوب
! مطلوب
|-
|-
| قيمة منطقية (bool)
| عدد (number)
| لا
| لا
|}
|}
=== <code>windowSize</code> ===


تُحدد الحدّ الأقصى من العناصر التي يمكن عرضها خارج المنطقة المرئية. على سبيل المثال إذا كانت القائمة تملأ الشاشة، فستعرض الخاصية <code>windowSize=21</code>  كامل القائمة (المنطقة المرئية) بالإضافة لمساحة 10 شاشات فارغة أعلى القائمة و10 أسفلها.


 
'''ملاحظة''': القيم الصغيرة لهذه الخاصية تؤدّي لتقليل استهلاك الذاكرة وتحسين الأداء، ولكنها تزيد من احتمالية ظهور مساحات فارغة عند التمرير بسرعة كبيرة.
=== <code>progressViewOffset</code> ===
 
اضبط قيمة هذه الخاصية إذا كنت تحتاج لمساحة لعرض مؤشر التحميل.


{| class="wikitable"
{| class="wikitable"
! النوع
! النوع
! مطلوب
! مطلوب
! نظام التشغيل
|-
|-
| رقم
| عدد (number)
| لا
| لا
| أندرويد
|}
|}
== التوابع ==


=== <code>()flashScrollINdicators</code> ===
<syntaxhighlight class="react" lang="javascript">flashScrollIndicators();</syntaxhighlight>


=== <code>‎getChildContext()‎</code> ===
<syntaxhighlight class="" lang="javascript">getChildContext() => Object;</syntaxhighlight>
يتكون الكائن <code>VirtualizedList</code> المُرجع من هذه الدالة من:


* <code>getScrollMetrics</code> (دالة). تُرجع كائن يحتوي على الخواص التالية:
<syntaxhighlight class="" lang="javascript">{
contentLength: number,
dOffest: number,
dt: number,
offset: number,
timestamp: number,
velocity: number,
visibleLength: number
}</syntaxhighlight><ul>
<li><p><code>horizontal</code> (قيمة منطقية) - اختياري-.</p></li>
<li><p><code>getOutermostParentListRef</code> (دالة).</p></li>
<li><p><code>getNestedChildState</code> (دالة) - تُرجع <code>ChildListState</code>.</p></li>
<li><p><code>registerAsNestedChild</code> (دالة) وتُرجع <code>ChildListState</code>. تستقبل كائنًا يحتوي على الخواص التالية:</p></li></ul>


<syntaxhighlight class="" lang="javascript">{
cellKey: string,
key: string,
ref: VirtualizedList,
parentDebugInfo: ListDebugInfo
}</syntaxhighlight>
*<code>unregisterAsNestedChild</code> (دالة). تستقبل كائن يحتوي على الخواص التالية:


== الدوال ==
<syntaxhighlight class="" lang="javascript">{
key: string,
state: ChildListState
}</syntaxhighlight>
* ‪<code>debugInfo</code> (ListDebugInfo)
===<code>()getScrollableNote</code>===


=== <code>scrollToEnd</code> ===
<syntaxhighlight class="react" lang="javascript">getScrollableNode () => ?number;</syntaxhighlight>
===<code>‎getScrollRef()‎</code>===


<syntaxhighlight class="react">scrollToEnd((params: object));
<syntaxhighlight class="react" lang="javascript">getScrollRef () => | ?React.ElementRef<typeof ScrollView>
    | ?React.ElementRef<typeof View>;</syntaxhighlight>
 
=== <code>()getScrollResponder</code> ===
<syntaxhighlight class="react" lang="javascript">getScrollResponder() => ?scollResponderType;</syntaxhighlight>يوفر معالجًا لمستجب التمرير الداخلي (الرئيسي). انتبه إلى أن <code>this._scrollRef</code> قد لا تكون <code>ScrollView</code>، لذا يجب التحقق من أنه يستجيب إلى <code>getScrollResponder</code> قبل استدعائه.
 
===<code>‎hasMore()‎</code>===
 
<syntaxhighlight class="react" lang="javascript">hasMore() => boolean</syntaxhighlight>
===<code>scrollToEnd</code>===
 
<syntaxhighlight class="react" lang="javascript">scrollToEnd((params: object));


Valid `params` consist of:
Valid `params` consist of:


- 'animated' (boolean). Optional default is true.</syntaxhighlight>
- 'animated' (boolean). Optional default is true.</syntaxhighlight>


=== <code>scrollToIndex</code> ===
=== <code>scrollToIndex</code> ===
 
<syntaxhighlight class="react" lang="javascript">scrollToIndex((params: object));</syntaxhighlight>
<syntaxhighlight class="react">scrollToIndex((params: object));</syntaxhighlight>
'''المعاملات'''
'''المعاملات'''


سطر 667: سطر 580:
! مطلوب
! مطلوب
|-
|-
| animated
| <code>animated</code>
| قيمة منطقية (bool)
| قيمة منطقية (bool)
| لا
| لا
|-
|-
| index
| <code>index</code>
| رقم (number)
| عدد (number)
| نعم
| نعم
|-
|-
| viewOffset
| <code>viewOffset</code>
| رقم (number)
| عدد (number)
| لا
| لا
|-
|-
| viewPosition
| <code>viewPosition</code>
| رقم (number)
| عدد (number)
| لا
| لا
|}
|}
=== <code>scrollToItem</code> ===
=== <code>scrollToItem</code> ===


<syntaxhighlight class="react">scrollToItem((params: object));</syntaxhighlight>
<syntaxhighlight class="react" lang="javascript">scrollToItem((params: object));</syntaxhighlight>
'''المعاملات'''
'''المعاملات'''


سطر 696: سطر 606:
! مطلوب
! مطلوب
|-
|-
| animated
| <code>animated</code>
| قيمة منطقية (bool)
| قيمة منطقية (bool)
| لا
| لا
|-
|-
| item
| <code>item</code>
| item
| item
| نعم
| نعم
|-
|-
| viewPosition
| <code>viewPosition</code>
| رقم (number)
| عدد (number)
| لا
| لا
|}
|}
=== <code>scrollToOffset</code> ===
=== <code>scrollToOffset</code> ===


<syntaxhighlight class="react">scrollToOffset((params: object));</syntaxhighlight>
<syntaxhighlight class="react" lang="javascript">scrollToOffset((params: object));</syntaxhighlight>
تُمرر إلى موضع معين في القائمة.
تُمرر إلى موضع معين في القائمة.


* يُحدد المعامل <code>offset</code> الإزاحة التي يجب التمرير لها. إذا كانت القائمة أفقية تكون قيمة هذه المعامل على محور (x)، وعلى محور (y) إذا كانت القائمة رأسية.
* يُحدد المعامل <code>offset</code> الإزاحة التي يجب التمرير لها. إذا كانت القائمة أفقية <code>horizontal</code> تكون قيمة هذه المعامل على محور (x)، وعلى محور (y) إذا كانت القائمة رأسية.
* يُحدد المعامل <code>animated</code> ما إذا كانت ستُضاف تأثيرات حركية أثناء عملية التمرير أم لا.
* يُحدد المعامل <code>animated</code> ما إذا كانت ستُضاف تأثيرات حركية أثناء عملية التمرير أم لا. قيمته الافتراضية <code>true</code>.
 
=== <code>‎recordInteraction()</code> ===
 
 
=== <code>()recordInteraction</code> ===
 
<syntaxhighlight class="react">recordInteraction();</syntaxhighlight>
 
 
=== <code>()flashScrollINdicators</code> ===
 
<syntaxhighlight class="react">flashScrollIndicators();</syntaxhighlight>
 
 
=== <code>getScrollResponder</code> ===
 
<syntaxhighlight class="react">getScrollResponder() => ?scollResponderType;</syntaxhighlight>
 
 
=== <code>()getScrollableNote</code> ===
 
<syntaxhighlight class="react">getScrollableNode () => ?number;</syntaxhighlight>
 
 
=== <code>()getScrollRef</code> ===
 
<syntaxhighlight class="react">getScrollRef () => | ?React.ElementRef<typeof ScrollView>
    | ?React.ElementRef<typeof View>;</syntaxhighlight>
 
 
=== <code>()setNativeProps</code> ===
 
<syntaxhighlight class="">setNativeProps((props: Object));</syntaxhighlight>
 
 
=== <code>()getChildContext</code> ===
 
<syntaxhighlight class="">getChildContext() => Object;</syntaxhighlight>
يتكون الكائن المُرجع من هذه الدالة من:
 
<ul>
<li><p><code>VirtualizedList</code> (كائن). يتكون من:</p></li>
<li><p><code>getScrollMetrics</code> (دالة). تُرجع كائن يحتوي على الخواص التالية: </p>
<syntaxhighlight class="">{
contentLength: number,
dOffest: number,
dt: number,
offset: number,
timestamp: number,
velocity: number,
visibleLength: number
}</syntaxhighlight></li>
<li><p><code>horizontal</code> (قيمة منطقية) - اختياري.</p></li>
<li><p><code>getOutermostParentListRef</code> (دالة).</p></li>
<li><p><code>getNestedChildState</code> (دالة) - تُرجع <code>ChildListState</code>.</p></li>
<li><p><code>registerAsNestedChild</code> (دالة). تستقبل كائن يحتوي على الخواص التالية:</p></li></ul>
 
<syntaxhighlight class="">{
cellKey: string,
key: string,
ref: VirtualizedList,
parentDebugInfo: ListDebugInfo
}</syntaxhighlight>
وتُرجع <code>ChildListState</code>.
 
* <code>unregisterAsNestedChild</code> (دالة). تستقبل كائن يحتوي على الخواص التالية:
 
<syntaxhighlight class="">{
key: string,
state: ChildListState
}</syntaxhighlight>
* <code>debugInfo</code> (ListDebugInfo)
 
 


=== <code>()hasMore</code> ===
<syntaxhighlight class="react" lang="javascript">recordInteraction();</syntaxhighlight>


<syntaxhighlight class="react">hasMore() => boolean</syntaxhighlight>
=== <code>‎setNativeProps()‎</code> ===
<syntaxhighlight class="" lang="javascript">setNativeProps((props: Object));</syntaxhighlight>
== المصادر ==
== المصادر ==


[https://reactnative.dev/docs/virtualizedlist صفحة VirtualizedList في توثيق React Native الرسمي.]
* [https://reactnative.dev/docs/virtualizedlist صفحة VirtualizedList في توثيق React Native الرسمي.]
[[تصنيف: ReactNatve]]
[[تصنيف: ReactNative]]
[[تصنيف:React Native Component]]

المراجعة الحالية بتاريخ 14:40، 9 أكتوبر 2021

إذا أردت أن تتحصل على مرونة أكبر من التي يوفرها المكونان <FlatList> و<SectionList> لطريقة عرض القوائم، فعليك استخدام المكون VirtualizedList، والذي يوفّر عناصر البناء الرئيسية لعرض القوائم. للاستخدام مع البيانات الغير قابلة للتعديل بدلًا عن المصفوفات العادية على سبيل المثال.

لهذا المكوّن فوائد عديدة حيث أنه يقلّل استهلاك الذاكرة ويحسِّن أداء القوائم كثيرًا من خلال الحفاظ على نافذة عرض محدودة للعناصر النشطة، ويستبدل العناصر الموجودة خارج هذه النافذة بمساحات فارغة بأحجام مناسبة. ويتم عرض العناصر تتابعيًا عند التمرير لأسفل في الشاشة، إذ تُعرض (تصير) العناصر البعيدة عن مجال الرؤية أو العرض بأسلوب أداء منخفض low-pri (قبل تشغيل أي تفاعلات) أو إن كانت قريب من مجال الرؤية، فتعرض بأسلوب أداء مرتفع hi-pri وكل ذلك لتقليل أي احتمال برؤية مسافة فارغة.

مثال

إليك المثال التالية (تجربة حية):

import React from 'react';
import { SafeAreaView, View, VirtualizedList, StyleSheet, Text, StatusBar } from 'react-native';

const DATA = [];

const getItem = (data, index) => ({
  id: Math.random().toString(12).substring(0),
  title: `Item ${index+1}`
});

const getItemCount = (data) => 50;

const Item = ({ title }) => (
  <View style={styles.item}>
    <Text style={styles.title}>{title}</Text>
  </View>
);

const App = () => {
  return (
    <SafeAreaView style={styles.container}>
      <VirtualizedList
        data={DATA}
        initialNumToRender={4}
        renderItem={({ item }) => <Item title={item.title} />}
        keyExtractor={item => item.key}
        getItemCount={getItemCount}
        getItem={getItem}
      />
    </SafeAreaView>
  );
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    marginTop: StatusBar.currentHeight,
  },
  item: {
    backgroundColor: '#f9c2ff',
    height: 150,
    justifyContent: 'center',
    marginVertical: 8,
    marginHorizontal: 16,
    padding: 20,
  },
  title: {
    fontSize: 32,
  },
});

export default App;

ملاحظات

  • عند تمرير المحتوى خارج نافضة العرض، لا يحتفظ المكون VirtualizedList بالحالة الخاصة به، لذلك يجب التأكد من حفظها في مخزن خارجي للبيانات مثل Flux أو Redux أو Relay.
  • يعتبر هذا المكون PureComponent، أي أنه لن يعاد رسمه إذا كانت الخاصيَّات متساوية تساويًا سطحيًا (shallow-equal). لذلك يجب التأكد من أن جميع الخاصيات التي تعتمد الدالة renderItem عليها قد تم تمريرها كمعاملات لا تساوي قيمتها قيمة الخاصيَّات الحالية للتأكد من تحديث واجهة المستخدم عند تغيير البيانات.
  • يُعرض المحتوى بطريقة غير متزامنة خارج نافذة العرض، وذلك للحفاظ على مساحة الذاكرة وضمان التمرير السلس، هذا يعي أنه من الممكن ظهور مساحات فارغة للحظات بسيطه قبل ظهور المحتوى عند التمرير بسرعة عالية. ونعمل على تحسين هذا السلوك خلف الكواليس.
  • يبحث المكون VirtualizedList افتراضيًا عن الخاصية key في كلّ عنصر من العناصر الأبناء.

الخاصيات

يرث خواص المكون ScrollView.

data

مصفوفة من الأصناف يمثِّل كلّ صنف أحد العناصر التي ستُعرض في القائمة، ويكون كلّ صِنف في الشكل {key: string} افتراضيًا، ويمكن استخدام الخاصيِّات getItem وgetItemCount وkeyExtractor للتعامل مع جميع انواع البيانات المُرتبة.

النوع مطلوب
أي نوع <any> نعم

getItem

(data: any, index: number) => object;

دالة تمكِّنك من الوصول لعنصر معين من العناصر المحفوظة في الخاصية data إن كانت بياناتها خام blob.

النوع مطلوب
دالة (function) نعم

getItemCount

(data: any) => number;

تحسب عدد العناصر الموجودة في البيانات الخام data.

النوع مطلوب
دالة (function) نعم

renderItem

(info: any) => ?React.Element<any>

تأخذ عنصر من data وتعرضه في القائمة.

النوع مطلوب
دالة (function) نعم

CellRendererComponent

تُعرض جميع الخلايا بواسطة هذا العنصر. وقد يكون React Component Class أو render function.

والقيمة الإفتراضية له هي المكون View.

النوع مطلوب
مكون component، دالة function لا

ItemSeparatorComponent

يعرض هذا المكوّن فواصلًا بين العناصر، ويمتلك الخاصيتين highlighted وleadingItem إفتراضيًّا.

توفِّر الخاصية renderItem الخواص separators.highlight وseparators.unhighlight واللتان تُستعملان لتحديث قيمة الخاصية highlighted. يمكن أيضًا إضافة خواص أخرى عن طريق الخاصية separators.updateProps.

النوع مطلوب
مكون component، دالة function لا

listEmptyComponent

يُعرض هذا المكون عندما تكون القائمة فارغة، ويمكن أن يكون مكون React (مثل SomeComponent) أو عنصر React (مثل <SomeComponent /‎>).

النوع مطلوب
مكون component، عنصر element لا

ListItemComponent

مكون يُستخدم لعرض عناصر القائمة، وقد يكون مكون صنف (Class component) أو دالة عرض (تصيير).

النوع مطلوب
مكون component، دالة function لا

ListFooterComponent

يُعرض في أسفل القائمة (تذييل للقائمة)، ويمكن أن يكون مكون React (مثل SomeComponent) أو عنصر React (مثل <SomeComponent /‎>).

النوع مطلوب
مكون component، عنصر element لا

ListFooterComponentStyle

تُحدد أنماط المكوّن ListFooterComponent.

النوع مطلوب
خاصيات ViewStyle لا

ListHeaderComponenet

يُُعرض في أعلى القائمة، وr$ ويمكن أن يكون مكون React (مثل SomeComponent) أو عنصر React (مثل <SomeComponent /‎>).

النوع مطلوب
مكون component، عنصر element لا

ListHeaderComponenetStyle

تُحدد أنماط المكون ListHeaderCompoenet.

النوع مطلوب
خاصيات ViewStyle لا

debug

يظهر المزيد من التفاصيل عن الأخطاء التي تحدث أثناء التعامل مع المكون VirtulizedList مما يسهل عملية تصحيح الأخطاء (debugging).

النوع مطلوب
قيمة منطقية (bool) لا

disableVirtualization

خاصية مهملة: توفِّر المحاكاة الافتراضية تحسينات كبيرة في الأداء والذاكرة إلَّا أنها تلغي تمامًا حالات التفاعل الموجودة خارج نافذة العرض، حيث يجب تعطيل هذه الخاصية فقط أثناء بناء التطبيق وتصحيح الأخطاء.

النوع مطلوب
قيمة منطقية (bool) لا

extraData

تجبر هذه الخاصية الجهاز على إعادة رسم القائمة عند تغير أي بيانات داخل القائمة. إذا كان هناك عنصر من العناصر التي ستعرض بواسطة الدالة renderItem يعتمد على بيانات تم تعريفها خارج الخاصية data، ينبغي إعادة تعريف هذه البيانات داخلها.

النوع مطلوب
قيمة منطقية (bool) لا

getItemLayout

(
    data: any,
    index: number,
  ) => {length: number, offset: number, index: number}
النوع مطلوب
دالة (function) لا

horizontal

إن كانت true، فستعرض عناصر القائمة بجانب بعضها بعضًا أفقيًا بدلًا من عرضها فوق بعضها شاقوليًا.

النوع مطلوب
قيمة منطقية (bool) لا

initialNumToRender

تُحدد عدد العناصر التي ستُعرض في أول دفعة. يجب أن يكون عدد العناصر كافي لملء الشاشة أو أقل من ذلك ولكن يجب أن لا يزيد عن حجم الشاشة.

ملاحظة: لتحسين عملية التمرير لأعلى (Scroll-to-top) يجب ألّا تُحذف هذه العناصر كجزء من إطارات العرض.

النوع مطلوب
عدد (number) لا

initialScrollIndex

بدلًا عن عرض أول عنصر في أعلى القائمة، تحدِّد هذه الخاصية ترتيب العنصر الذي يجب بدء عرضه في بداية القائمة، وذلك عن طريق ايقاف تحسين التمرير الى الأعلى الذي يحافظ على عرض عناصر initialNumToRender ويُعرض العناصر ابتداءً من أول عنصر في الترتيب، وتتطلّب هذه الخاصية أن تكون الخاصية getItemLayout مفعّلة.

النوع مطلوب
عدد (number) لا

inverted

تعكس إتجاه التمرير باستخدام تحويلات بمقياس (-1).

النوع مطلوب
دالة (function) لا

listKey

مُعرِّف فريد للقائمة، وإذا كان هناك أكثر من قائمة في نفس المستوى (أبناء لعنصر واحد) متفرعة من قائمة أخرى، فيجب تحديد مفتاح مميز لكلّ قائمة لتُعرض القوائم وتعمل بشكل صحيح.

النوع مطلوب
سلسلة نصية (string) لا

keyExtractor

(item: object, index: number) => string;

تُستخدم للحصول على مفتاح عنصر ذو ترتيب معيّن في القائمة. يستخدم المفتاح للتخزين المؤقت (Caching) و على أساس مفتاح لتتبع ترتيب العناصر. يتحقق مُستخرج المفاتيح الافتراضي من item.key، ثم يرجع لاستخدام الترتيب، مثل ما يحدث في React تمامًا.

النوع مطلوب
دالة (function) لا

maxToRenderPerBatch

تُحدد أقصى عدد من العناصر يمكن عرضه في الدفعة الواحدة، وكلما زاد هذا العدد ستحصل على معدل ملء شاشة أفضل، ولكن قد يتأثر تجاوب التطبيق مع أحجام الشاشات المختلفة (responsiveness) بسبب تداخل المحتوى المعروض عند الضغط على الأزرار أو التفاعلات الأخرى.

النوع مطلوب
عدد (number) لا

onEndReached

دالة تستدعى عند الوصول للموقع المحدَّد بالخاصية onEndReachedThreshold في المحتوى المعروض.

(info: {distanceFromEnd: number}) => void;
النوع مطلوب
دالة (function) لا

onEndReachedThreshold

تُحدد إلى أيّ مدى يجب أن تكون الحافة السفلية للقائمة بعيدة من نهاية المحتوى (بوحدات الطول المرئي للقائمة) لتشغيل رد النداء onEndReached. فالقيمة 0.5 على سبيل المثال ستُشغل ردّ النداء onEndReached عندما تكون نهاية المحتوى في حدود نصف الطول المرئي للقائمة.

النوع مطلوب
عدد (number) لا

onRefresh

() => void

توفِّر RefreshControl قياسي يُضاف لوظيفة السحب للتحديث (Pull to Refresh)، وعند استخدامها يجب التأكد من ضبط الخاصية refreshing بطريقة صحيحة.

النوع مطلوب
دالة (funcion) لا

onScrollToIndexFailed

دالة تُستدعى في حالة حدوث خطأ عند التمرير لعنصر معين، فإمّا أن تحسب الإزاحة الخاصة بالعنصر الذي حدث الخطأ عند التمرير إليه وإعادة التمرير إليها مَرةً أخرى، أو التمرير لنهاية القائمة ثم الرجوع لذلك العنصر.

(info: {
    index: number,
    highestMeasuredFrameIndex: number,
    averageItemLength: number,
  }) => void
النوع مطلوب
دالة (funcion) لا

onViewableItemsChanged

دالة تُستدعى عندما تتغير الصفوف المعروضة، كما هي مُعرَّفة بالخاصية ViewabilityConfig.

(info: {
    viewableItems: array,
    changed: array,
  }) => void
النوع مطلوب
دالة (funcion)

‎(callback: { changed: array of ViewTokens, viewableItems: array of ViewTokens }) => void

لا

persistentScrollbar

النوع مطلوب
قيمة منطقية (bool) لا

progressViewOffset

اضبط قيمة هذه الخاصية إذا كنت تحتاج لمساحة لعرض مؤشر التحميل.

النوع مطلوب
عدد لا

refreshing

اعطي هذه الخاصية القيمة true أثناء إنتظار تحميل بيانات جديدة.

النوع مطلوب
قيمة منطقية (bool) لا

refreshControl

عنصر يستخدم للتحكم في طريقة تحديث عناصر القائمة، ويستبدل المكون <RefreshControl> الأصلي، وعند استخدامة يتم تجاهل الخاصيتين onRefreshing وrefreshing.

ملاحظة: يعمل فقط مع المكوّن VirtualizedList عندما تكون القائمة رأسية.

النوع مطلوب
عنصر element لا

removeClippedSubviews

تُستخدم لتحسين عملية التمرير في القوائم الطويلة.

ملاحظة: قد تحتوي على أخطاء (محتوى مفقود) في بعض الحالات - استخدمها على مسؤوليتك الخاصة-.

النوع مطلوب
قيمة منطقية (bool) لا

renderScrollComponent

(props: object) => element;

تعرض عنصر تمرير (scroll element) مخصَّص، على سبيل المثال RefreshControl ذو أنماط مختلفة.

النوع مطلوب
دالة (function) لا

viewabilityConfig

انظر ViewabilityHelper.js لمزيد من المعلومات.

النوع مطلوب
ViewabilityConfig لا

viewabilityConfigCallbackPairs

قائمة من أزواج، يتكون كل زوج من المكونين ViewabilityConfig و onViewableItemsChanged. تُستدعى الدالة onViewableItemsChanged من زوج معين عندما يتم استيفاء شروطها المحددة في الخاصية ViewabilityConfig في نفس الزوج.

النوع مطلوب
مصوفة من الكائن ViewabilityConfigCallbackPair لا

updateCellsBatchingPeriod

تُحدد المدة الزمنية بين عرض دفعات العناصر بعيدة الرؤية في الوضع low-pri لعرض هذه العناصر. تشبه إلى حد ما maxToRenderPerBatch.

النوع مطلوب
عدد (number) لا

windowSize

تُحدد الحدّ الأقصى من العناصر التي يمكن عرضها خارج المنطقة المرئية. على سبيل المثال إذا كانت القائمة تملأ الشاشة، فستعرض الخاصية windowSize=21 كامل القائمة (المنطقة المرئية) بالإضافة لمساحة 10 شاشات فارغة أعلى القائمة و10 أسفلها.

ملاحظة: القيم الصغيرة لهذه الخاصية تؤدّي لتقليل استهلاك الذاكرة وتحسين الأداء، ولكنها تزيد من احتمالية ظهور مساحات فارغة عند التمرير بسرعة كبيرة.

النوع مطلوب
عدد (number) لا

التوابع

()flashScrollINdicators

flashScrollIndicators();

‎getChildContext()‎

getChildContext() => Object;

يتكون الكائن VirtualizedList المُرجع من هذه الدالة من:

  • getScrollMetrics (دالة). تُرجع كائن يحتوي على الخواص التالية:
{
	contentLength: number,
	dOffest: number,
	dt: number,
	offset: number,
	timestamp: number,
	velocity: number,
	visibleLength: number
}
  • horizontal (قيمة منطقية) - اختياري-.

  • getOutermostParentListRef (دالة).

  • getNestedChildState (دالة) - تُرجع ChildListState.

  • registerAsNestedChild (دالة) وتُرجع ChildListState. تستقبل كائنًا يحتوي على الخواص التالية:

{
	cellKey: string,
	key: string,
	ref: VirtualizedList,
	parentDebugInfo: ListDebugInfo
}
  • unregisterAsNestedChild (دالة). تستقبل كائن يحتوي على الخواص التالية:
{
	key: string,
	state: ChildListState
}
  • debugInfo (ListDebugInfo)

()getScrollableNote

getScrollableNode () => ?number;

‎getScrollRef()‎

getScrollRef () => | ?React.ElementRef<typeof ScrollView>
    | ?React.ElementRef<typeof View>;

()getScrollResponder

getScrollResponder() => ?scollResponderType;

يوفر معالجًا لمستجب التمرير الداخلي (الرئيسي). انتبه إلى أن this._scrollRef قد لا تكون ScrollView، لذا يجب التحقق من أنه يستجيب إلى getScrollResponder قبل استدعائه.

‎hasMore()‎

hasMore() => boolean

scrollToEnd

scrollToEnd((params: object));

Valid `params` consist of:

- 'animated' (boolean). Optional default is true.

scrollToIndex

scrollToIndex((params: object));

المعاملات

المعامل النوع مطلوب
animated قيمة منطقية (bool) لا
index عدد (number) نعم
viewOffset عدد (number) لا
viewPosition عدد (number) لا

scrollToItem

scrollToItem((params: object));

المعاملات

المعامل النوع مطلوب
animated قيمة منطقية (bool) لا
item item نعم
viewPosition عدد (number) لا

scrollToOffset

scrollToOffset((params: object));

تُمرر إلى موضع معين في القائمة.

  • يُحدد المعامل offset الإزاحة التي يجب التمرير لها. إذا كانت القائمة أفقية horizontal تكون قيمة هذه المعامل على محور (x)، وعلى محور (y) إذا كانت القائمة رأسية.
  • يُحدد المعامل animated ما إذا كانت ستُضاف تأثيرات حركية أثناء عملية التمرير أم لا. قيمته الافتراضية true.

‎recordInteraction()‎

recordInteraction();

‎setNativeProps()‎

setNativeProps((props: Object));

المصادر