الفرق بين المراجعتين لصفحة: «ReactNative/virtualizedlist»
رقية-بورية (نقاش | مساهمات) رفع المحتوى |
رقية-بورية (نقاش | مساهمات) ط مراجعة |
||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:المكون VirtualizedList في ReactNative}}</noinclude> | <noinclude>{{DISPLAYTITLE:المكون VirtualizedList في ReactNative}}</noinclude> | ||
إذا أردت أن تتحصل على مرونة أكبر من التي يوفرها المكونان [ | إذا أردت أن تتحصل على مرونة أكبر من التي يوفرها المكونان <code>[[ReactNative/flatlist|<FlatList>]]</code> و<code>[[ReactNative/sectionlist|<SectionList>]]</code> لطريقة عرض القوائم، فعليك استخدام المكون <code>VirtualizedList،</code> والذي يوفّر عناصر البناء الرئيسية لعرض القوائم. للاستخدام مع البيانات الغير قابلة للتعديل بدلًا عن المصفوفات العادية على سبيل المثال. | ||
لهذا | لهذا المكوّن فوائد عديدة حيث أنه يقلّل استهلاك الذاكرة ويحسِّن أداء القوائم كثيرًا من خلال الحفاظ على نافذة عرض محدودة للعناصر النشطة، ويستبدل العناصر الموجودة خارج هذه النافذة بمساحات فارغة بأحجام مناسبة. ويتم عرض العناصر تتابعيًا عند التمرير لأسفل في الشاشة. | ||
'''مثال''' | '''مثال''' | ||
<syntaxhighlight class="react">import React from 'react'; | <syntaxhighlight class="react" lang="javascript">import React from 'react'; | ||
import { SafeAreaView, View, VirtualizedList, StyleSheet, Text } from 'react-native'; | import { SafeAreaView, View, VirtualizedList, StyleSheet, Text } from 'react-native'; | ||
import Constants from 'expo-constants'; | import Constants from 'expo-constants'; | ||
سطر 65: | سطر 65: | ||
export default VirtualizedListExample;</syntaxhighlight> | export default VirtualizedListExample;</syntaxhighlight> | ||
'''ملاحظات''' | '''ملاحظات''' | ||
سطر 71: | سطر 70: | ||
* عند تمرير المحتوى خارج نافضة العرض، لا يحتفظ المكون <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> في كلّ عنصر من العناصر الأبناء. | ||
__toc__ | __toc__ | ||
سطر 78: | سطر 77: | ||
== الخاصيات == | == الخاصيات == | ||
يرث خواص المكون [ | يرث خواص المكون <code>[[ReactNative/scrollview#الخاصيات|ScrollView]]</code>. | ||
=== <code>renderItem</code> === | === <code>renderItem</code> === | ||
<syntaxhighlight class="react">(info: any) => ?React.Element<any></syntaxhighlight> | <syntaxhighlight class="react" lang="javascript">(info: any) => ?React.Element<any></syntaxhighlight> | ||
تأخذ عنصر من <code>data</code> وتعرضه في القائمة. | تأخذ عنصر من <code>data</code> وتعرضه في القائمة. | ||
سطر 92: | سطر 91: | ||
| نعم | | نعم | ||
|} | |} | ||
=== <code>data</code> === | === <code>data</code> === | ||
مصفوفة من الأصناف يمثِّل كلّ صنف أحد العناصر التي ستُعرض في القائمة، ويكون كلّ صِنف في الشكل <code>{key: string}</code> افتراضيًا، ويمكن استخدام الخاصيِّات <code>getItem</code> و<code>getItemCount</code> و<code>keyExtractor</code> للتعامل مع جميع انواع البيانات المُرتبة. | |||
{| class="wikitable" | {| class="wikitable" | ||
سطر 106: | سطر 102: | ||
| نعم | | نعم | ||
|} | |} | ||
=== <code>getItem</code> === | === <code>getItem</code> === | ||
<syntaxhighlight class="react">(data: any, index: number) => object;</syntaxhighlight> | <syntaxhighlight class="react" lang="javascript">(data: any, index: number) => object;</syntaxhighlight> | ||
دالة | دالة تمكِّنك من الوصول لعنصر معين من العناصر المحفوظة في الخاصية <code>data</code>. | ||
{| class="wikitable" | {| class="wikitable" | ||
سطر 121: | سطر 114: | ||
| نعم | | نعم | ||
|} | |} | ||
=== <code>getItemCount</code> === | === <code>getItemCount</code> === | ||
<syntaxhighlight class="react">(data: any) => number;</syntaxhighlight> | <syntaxhighlight class="react" lang="javascript">(data: any) => number;</syntaxhighlight> | ||
تحسب عدد العناصر الموجودة في المصفوفة <code>data</code>. | تحسب عدد العناصر الموجودة في المصفوفة <code>data</code>. | ||
سطر 136: | سطر 126: | ||
| نعم | | نعم | ||
|} | |} | ||
=== <code>debug</code> === | === <code>debug</code> === | ||
سطر 150: | سطر 137: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>extraData</code> === | === <code>extraData</code> === | ||
سطر 164: | سطر 148: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>getItemLayout</code> === | === <code>getItemLayout</code> === | ||
<syntaxhighlight class="react">( | <syntaxhighlight class="react" lang="javascript">( | ||
data: any, | data: any, | ||
index: number, | index: number, | ||
سطر 180: | سطر 161: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>initialScrollIndex</code> === | === <code>initialScrollIndex</code> === | ||
بدلًا عن عرض أول عنصر في أعلى القائمة، | بدلًا عن عرض أول عنصر في أعلى القائمة، تحدِّد هذه الخاصية ترتيب العنصر الذي يجب بدء عرضه في بداية القائمة، وذلك عن طريق ايقاف تحسين التمرير الى الأعلى الذي يحافظ على عرض عناصر <code>initialNumToRender</code> ويُعرض العناصر ابتداءً من أول عنصر في الترتيب، وتتطلّب هذه الخاصية أن تكون الخاصية <code>getItemLayout</code> مفعّلة. | ||
{| class="wikitable" | {| class="wikitable" | ||
سطر 194: | سطر 172: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>inverted</code> === | === <code>inverted</code> === | ||
سطر 208: | سطر 183: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>CellRendererComponent</code> === | === <code>CellRendererComponent</code> === | ||
تُعرض جميع الخلايا بواسطة هذا العنصر. | تُعرض جميع الخلايا بواسطة هذا العنصر. وقد يكون <code>React Component Class</code> أو <code>render function</code>. | ||
والقيمة الإفتراضية له هي المكون <code>View</code>. | والقيمة الإفتراضية له هي المكون <code>[[ReactNative/view|View]]</code>. | ||
{| class="wikitable" | {| class="wikitable" | ||
سطر 224: | سطر 196: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>ItemSeparatorComponent</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" | ||
سطر 240: | سطر 209: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>listKey</code> === | === <code>listKey</code> === | ||
إذا كان هناك أكثر من قائمة في نفس المستوى (أبناء لعنصر واحد) | إذا كان هناك أكثر من قائمة في نفس المستوى (أبناء لعنصر واحد) فيجب تحديد مفتاح مميز لكلّ قائمة. | ||
{| class="wikitable" | {| class="wikitable" | ||
سطر 254: | سطر 220: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>listEmptyComponent</code> === | === <code>listEmptyComponent</code> === | ||
يُعرض هذا المكون عندما تكون القائمة فارغة، | يُعرض هذا المكون عندما تكون القائمة فارغة، وقد يكون مكوِّنًا صنفيًّا (Class component) أو مكونًا دالِّيًا (function componenet) أو عنصرًا. | ||
{| class="wikitable" | {| class="wikitable" | ||
سطر 268: | سطر 231: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>ListItemComponent</code> === | === <code>ListItemComponent</code> === | ||
مكون | مكون يُستخدم لعرض عناصر القائمة، وقد يكون مكونًا كائنيًّأ (Class component) أو دالة عرض. | ||
{| class="wikitable" | {| class="wikitable" | ||
! النوع | ! النوع | ||
سطر 284: | سطر 241: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>ListFooterComponent</code> === | === <code>ListFooterComponent</code> === | ||
يُعرض في أسفل القائمة (تذييل للقائمة) | يُعرض في أسفل القائمة (تذييل للقائمة)، وقد يكون مكوِّنًا صنفيًّا (Class component) أو مكونًا دالِّيًا (function componenet) أو عنصرًا. | ||
{| class="wikitable" | {| class="wikitable" | ||
سطر 298: | سطر 252: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>ListFooterComponentStyle</code> === | === <code>ListFooterComponentStyle</code> === | ||
تُحدد أنماط | تُحدد أنماط المكوّن <code>ListFooterComponent</code>. | ||
{| class="wikitable" | {| class="wikitable" | ||
سطر 309: | سطر 260: | ||
! مطلوب | ! مطلوب | ||
|- | |- | ||
| | | <code>[[ReactNative/view style props|ViewStyleProp]]</code> | ||
| لا | | لا | ||
|} | |} | ||
=== <code>ListHeaderComponenet</code> === | === <code>ListHeaderComponenet</code> === | ||
يُُعرض في أعلى القائمة، | يُُعرض في أعلى القائمة، وr$ يكون مكوِّن صنفي (Class component) أو مكون دالِّي (function componenet). | ||
{| class="wikitable" | {| class="wikitable" | ||
! النوع | ! النوع | ||
سطر 328: | سطر 273: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>ListHeaderComponenetStyle</code> === | === <code>ListHeaderComponenetStyle</code> === | ||
سطر 342: | سطر 284: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>onRefresh</code> === | === <code>onRefresh</code> === | ||
<syntaxhighlight class="react">() => void</syntaxhighlight> | <syntaxhighlight class="react" lang="javascript">() => void</syntaxhighlight> | ||
توفِّر <code>RefreshControl</code> قياسي يُضاف لوظيفة السحب للتحديث (Pull to Refresh)، وعند استخدامها يجب التأكد من ضبط الخاصية <code>refreshing</code> بطريقة صحيحة. | |||
{| class="wikitable" | {| class="wikitable" | ||
سطر 357: | سطر 296: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>onScrollToIndexFailed</code> === | === <code>onScrollToIndexFailed</code> === | ||
دالة تُستدعى في حالة حدوث خطأ عند التمرير لعنصر معين، فإمّا أن تحسب الإزاحة الخاصة بالعنصر الذي حدث الخطأ عند التمرير إليه وإعادة التمرير إليها | دالة تُستدعى في حالة حدوث خطأ عند التمرير لعنصر معين، فإمّا أن تحسب الإزاحة الخاصة بالعنصر الذي حدث الخطأ عند التمرير إليه وإعادة التمرير إليها مَرةً أخرى، أو التمرير لنهاية القائمة ثم الرجوع لذلك العنصر. | ||
<syntaxhighlight class="react">(info: { | <syntaxhighlight class="react" lang="javascript">(info: { | ||
index: number, | index: number, | ||
highestMeasuredFrameIndex: number, | highestMeasuredFrameIndex: number, | ||
سطر 376: | سطر 312: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>onViewableItemsChanged</code> === | === <code>onViewableItemsChanged</code> === | ||
<syntaxhighlight class="react">(info: { | <syntaxhighlight class="react" lang="javascript">(info: { | ||
viewableItems: array, | viewableItems: array, | ||
changed: array, | changed: array, | ||
سطر 394: | سطر 327: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>refreshing</code> === | === <code>refreshing</code> === | ||
سطر 408: | سطر 338: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>refreshControl</code> === | === <code>refreshControl</code> === | ||
عنصر يستخدم للتحكم في طريقة تحديث عناصر القائمة، ويستبدل المكون <code><RefreshControl></code> الأصلي، وعند استخدامة يتم تجاهل الخاصيتين <code>onRefreshing</code> و <code>refreshing</code>. | عنصر يستخدم للتحكم في طريقة تحديث عناصر القائمة، ويستبدل المكون <code><RefreshControl></code> الأصلي، وعند استخدامة يتم تجاهل الخاصيتين <code>onRefreshing</code> و<code>refreshing</code>. | ||
'''ملاحظة''': يعمل فقط مع | '''ملاحظة''': يعمل فقط مع المكوّن <code>VirtualizedList</code> عندما تكون القائمة رأسية. | ||
{| class="wikitable" | {| class="wikitable" | ||
سطر 424: | سطر 351: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>removeClippedSubviews</code> === | === <code>removeClippedSubviews</code> === | ||
تُستخدم لتحسين عملية التمرير في القوائم الطويلة. | |||
'''ملاحظة''': قد تحتوي على أخطاء (محتوى مفقود) في بعض الحالات - استخدمها على مسؤوليتك الخاصة. | '''ملاحظة''': قد تحتوي على أخطاء (محتوى مفقود) في بعض الحالات - استخدمها على مسؤوليتك الخاصة-. | ||
{| class="wikitable" | {| class="wikitable" | ||
سطر 440: | سطر 364: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>renderScrollComponent</code> === | === <code>renderScrollComponent</code> === | ||
<syntaxhighlight class="react">(props: object) => element;</syntaxhighlight> | <syntaxhighlight class="react" lang="javascript">(props: object) => element;</syntaxhighlight> | ||
تعرض عنصر تمرير (scroll element) | تعرض عنصر تمرير (scroll element) مخصَّص، على سبيل المثال <code><RefreshControl></code> ذو أنماط مختلفة. | ||
{| class="wikitable" | {| class="wikitable" | ||
سطر 455: | سطر 376: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>viewabilityConfig</code> === | === <code>viewabilityConfig</code> === | ||
أُنظر [https://gist.github.com/sahrens/634233c57ef6c2cb694a <code>ViewabilityHelper.js</code>] لمزيد من المعلومات. | |||
{| class="wikitable" | {| class="wikitable" | ||
سطر 466: | سطر 384: | ||
! مطلوب | ! مطلوب | ||
|- | |- | ||
| ViewabilityConfig | | <code>ViewabilityConfig</code> | ||
| لا | | لا | ||
|} | |} | ||
=== <code>viewabilityConfigCallbackPairs</code> === | === <code>viewabilityConfigCallbackPairs</code> === | ||
سطر 480: | سطر 395: | ||
! مطلوب | ! مطلوب | ||
|- | |- | ||
| array of ViewabilityConfigCallbackPair | | (array of (ViewabilityConfigCallbackPair | ||
| لا | | لا | ||
|} | |} | ||
=== <code>horizontal</code> === | === <code>horizontal</code> === | ||
سطر 495: | سطر 407: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>initialNumToRender</code> === | === <code>initialNumToRender</code> === | ||
سطر 511: | سطر 420: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>keyExtractor</code> === | === <code>keyExtractor</code> === | ||
<syntaxhighlight class="react">(item: object, index: number) => string;</syntaxhighlight> | <syntaxhighlight class="react" lang="javascript">(item: object, index: number) => string;</syntaxhighlight> | ||
تُستخدم للحصول على مفتاح عنصر ذو ترتيب | تُستخدم للحصول على مفتاح عنصر ذو ترتيب معيّن في القائمة. يستخدم المفتاح للتخزين المؤقت (Caching) و على أساس مفتاح لتتبع ترتيب العناصر. يتحقق مُستخرج المفاتيح الافتراضي من <code>item.key</code>، ثم يرجع لاستخدام الترتيب، مثل ما يحدث في [[React]] تمامًا. | ||
{| class="wikitable" | {| class="wikitable" | ||
سطر 526: | سطر 432: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>maxToRenderPerBatch</code> === | === <code>maxToRenderPerBatch</code> === | ||
سطر 540: | سطر 443: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>onEndReached</code> === | === <code>onEndReached</code> === | ||
دالة تستدعى عند الوصول للموقع | دالة تستدعى عند الوصول للموقع المحدَّد بالخاصية <code>onEndReachedThreshold</code> في المحتوى المعروض. | ||
<syntaxhighlight class="react">(info: {distanceFromEnd: number}) => void;</syntaxhighlight> | <syntaxhighlight class="react" lang="javascript">(info: {distanceFromEnd: number}) => void;</syntaxhighlight> | ||
{| class="wikitable" | {| class="wikitable" | ||
! النوع | ! النوع | ||
سطر 555: | سطر 455: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>onEndReachedThreshold</code> === | === <code>onEndReachedThreshold</code> === | ||
تُحدد إلى | تُحدد إلى أيّ مدى يجب أن تكون الحافة السفلية للقائمة بعيدة من نهاية المحتوى (بوحدات الطول المرئي للقائمة) لتشغيل رد النداء <code>onEndReached</code>. فالقيمة 0.5 على سبيل المثال ستُشغل ردّ النداء <code>onEndReached</code> عندما تكون نهاية المحتوى في حدود نصف الطول المرئي للقائمة. | ||
{| class="wikitable" | {| class="wikitable" | ||
سطر 566: | سطر 463: | ||
! مطلوب | ! مطلوب | ||
|- | |- | ||
| | | عدد (number) | ||
| لا | | لا | ||
|} | |} | ||
=== <code>updateCellsBatchingPeriod</code> === | === <code>updateCellsBatchingPeriod</code> === | ||
سطر 580: | سطر 474: | ||
! مطلوب | ! مطلوب | ||
|- | |- | ||
| | | عدد (number) | ||
| لا | | لا | ||
|} | |} | ||
=== <code>windowSize</code> === | === <code>windowSize</code> === | ||
تُحدد | تُحدد الحدّ الأقصى من العناصر التي يمكن عرضها خارج المنطقة المرئية. على سبيل المثال إذا كانت القائمة تملأ الشاشة، فستعرض الخاصية <code>windowSize=21</code> كامل القائمة (المنطقة المرئية) بالإضافة لمساحة 10 شاشات فارغة أعلى القائمة و10 أسفلها. | ||
'''ملاحظة''': القيم الصغيرة لهذه الخاصية | '''ملاحظة''': القيم الصغيرة لهذه الخاصية تؤدّي لتقليل استهلاك الذاكرة وتحسين الأداء، ولكنها تزيد من احتمالية ظهور مساحات فارغة عند التمرير بسرعة كبيرة. | ||
{| class="wikitable" | {| class="wikitable" | ||
سطر 596: | سطر 487: | ||
! مطلوب | ! مطلوب | ||
|- | |- | ||
| | | عدد (number) | ||
| لا | | لا | ||
|} | |} | ||
=== <code>disableVirtualization</code> === | === <code>disableVirtualization</code> === | ||
'''خاصية مهملة''': | '''خاصية مهملة''': توفِّر المحاكاة الافتراضية تحسينات كبيرة في الأداء والذاكرة إلَّا أنها تلغي تمامًا حالات التفاعل الموجودة خارج نافذة العرض، حيث يجب تعطيل هذه الخاصية فقط أثناء بناء التطبيق وتصحيح الأخطاء. | ||
{| class="wikitable" | {| class="wikitable" | ||
سطر 613: | سطر 501: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>persistentScrollbar</code> === | === <code>persistentScrollbar</code> === | ||
سطر 625: | سطر 510: | ||
| لا | | لا | ||
|} | |} | ||
=== <code>progressViewOffset</code> === | === <code>progressViewOffset</code> === | ||
سطر 637: | سطر 519: | ||
! نظام التشغيل | ! نظام التشغيل | ||
|- | |- | ||
| | | عدد | ||
| لا | | لا | ||
| أندرويد | | أندرويد | ||
|} | |} | ||
== الدوال == | == الدوال == | ||
=== <code>scrollToEnd</code> === | === <code>scrollToEnd</code> === | ||
<syntaxhighlight class="react">scrollToEnd((params: object)); | <syntaxhighlight class="react" lang="javascript">scrollToEnd((params: object)); | ||
Valid `params` consist of: | Valid `params` consist of: | ||
سطر 659: | سطر 536: | ||
=== <code>scrollToIndex</code> === | === <code>scrollToIndex</code> === | ||
<syntaxhighlight class="react">scrollToIndex((params: object));</syntaxhighlight> | <syntaxhighlight class="react" lang="javascript">scrollToIndex((params: object));</syntaxhighlight> | ||
'''المعاملات''' | '''المعاملات''' | ||
سطر 667: | سطر 544: | ||
! مطلوب | ! مطلوب | ||
|- | |- | ||
| animated | | <code>animated</code> | ||
| قيمة منطقية (bool) | | قيمة منطقية (bool) | ||
| لا | | لا | ||
|- | |- | ||
| index | | <code>index</code> | ||
| | | عدد (number) | ||
| نعم | | نعم | ||
|- | |- | ||
| viewOffset | | <code>viewOffset</code> | ||
| | | عدد (number) | ||
| لا | | لا | ||
|- | |- | ||
| viewPosition | | <code>viewPosition</code> | ||
| | | عدد (number) | ||
| لا | | لا | ||
|} | |} | ||
=== <code>scrollToItem</code> === | === <code>scrollToItem</code> === | ||
<syntaxhighlight class="react">scrollToItem((params: object));</syntaxhighlight> | <syntaxhighlight class="react" lang="javascript">scrollToItem((params: object));</syntaxhighlight> | ||
'''المعاملات''' | '''المعاملات''' | ||
سطر 696: | سطر 570: | ||
! مطلوب | ! مطلوب | ||
|- | |- | ||
| animated | | <code>animated</code> | ||
| قيمة منطقية (bool) | | قيمة منطقية (bool) | ||
| لا | | لا | ||
|- | |- | ||
| item | | <code>item</code> | ||
| item | | item | ||
| نعم | | نعم | ||
|- | |- | ||
| viewPosition | | <code>viewPosition</code> | ||
| | | عدد (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> الإزاحة التي يجب التمرير لها. إذا كانت القائمة أفقية تكون قيمة هذه المعامل على محور (x)، وعلى محور (y) إذا كانت القائمة رأسية. | ||
* يُحدد المعامل <code>animated</code> ما إذا كانت ستُضاف تأثيرات حركية أثناء عملية التمرير أم لا. | * يُحدد المعامل <code>animated</code> ما إذا كانت ستُضاف تأثيرات حركية أثناء عملية التمرير أم لا. | ||
=== <code>()recordInteraction</code> === | === <code>()recordInteraction</code> === | ||
<syntaxhighlight class="react">recordInteraction();</syntaxhighlight> | <syntaxhighlight class="react" lang="javascript">recordInteraction();</syntaxhighlight> | ||
=== <code>()flashScrollINdicators</code> === | === <code>()flashScrollINdicators</code> === | ||
<syntaxhighlight class="react">flashScrollIndicators();</syntaxhighlight> | <syntaxhighlight class="react" lang="javascript">flashScrollIndicators();</syntaxhighlight> | ||
=== <code>getScrollResponder</code> === | === <code>getScrollResponder</code> === | ||
<syntaxhighlight class="react">getScrollResponder() => ?scollResponderType;</syntaxhighlight> | <syntaxhighlight class="react" lang="javascript">getScrollResponder() => ?scollResponderType;</syntaxhighlight> | ||
=== <code>()getScrollableNote</code> === | === <code>()getScrollableNote</code> === | ||
<syntaxhighlight class="react">getScrollableNode () => ?number;</syntaxhighlight> | <syntaxhighlight class="react" lang="javascript">getScrollableNode () => ?number;</syntaxhighlight> | ||
=== <code>()getScrollRef</code> === | === <code>()getScrollRef</code> === | ||
<syntaxhighlight class="react">getScrollRef () => | ?React.ElementRef<typeof ScrollView> | <syntaxhighlight class="react" lang="javascript">getScrollRef () => | ?React.ElementRef<typeof ScrollView> | ||
| ?React.ElementRef<typeof View>;</syntaxhighlight> | | ?React.ElementRef<typeof View>;</syntaxhighlight> | ||
=== <code>()setNativeProps</code> === | === <code>()setNativeProps</code> === | ||
<syntaxhighlight class="">setNativeProps((props: Object));</syntaxhighlight> | <syntaxhighlight class="" lang="javascript">setNativeProps((props: Object));</syntaxhighlight> | ||
=== <code>()getChildContext</code> === | === <code>()getChildContext</code> === | ||
<syntaxhighlight class="">getChildContext() => Object;</syntaxhighlight> | <syntaxhighlight class="" lang="javascript">getChildContext() => Object;</syntaxhighlight> | ||
يتكون الكائن المُرجع من هذه الدالة من: | يتكون الكائن المُرجع من هذه الدالة من: | ||
سطر 760: | سطر 616: | ||
<li><p><code>VirtualizedList</code> (كائن). يتكون من:</p></li> | <li><p><code>VirtualizedList</code> (كائن). يتكون من:</p></li> | ||
<li><p><code>getScrollMetrics</code> (دالة). تُرجع كائن يحتوي على الخواص التالية: </p> | <li><p><code>getScrollMetrics</code> (دالة). تُرجع كائن يحتوي على الخواص التالية: </p> | ||
<syntaxhighlight class="">{ | <syntaxhighlight class="" lang="javascript">{ | ||
contentLength: number, | contentLength: number, | ||
dOffest: number, | dOffest: number, | ||
سطر 769: | سطر 625: | ||
visibleLength: number | visibleLength: number | ||
}</syntaxhighlight></li> | }</syntaxhighlight></li> | ||
<li><p><code>horizontal</code> (قيمة منطقية) - اختياري.</p></li> | <li><p><code>horizontal</code> (قيمة منطقية) - اختياري-.</p></li> | ||
<li><p><code>getOutermostParentListRef</code> (دالة).</p></li> | <li><p><code>getOutermostParentListRef</code> (دالة).</p></li> | ||
<li><p><code>getNestedChildState</code> (دالة) - تُرجع <code>ChildListState</code>.</p></li> | <li><p><code>getNestedChildState</code> (دالة) - تُرجع <code>ChildListState</code>.</p></li> | ||
<li><p><code>registerAsNestedChild</code> (دالة). تستقبل كائن يحتوي على الخواص التالية:</p></li></ul> | <li><p><code>registerAsNestedChild</code> (دالة). تستقبل كائن يحتوي على الخواص التالية:</p></li></ul> | ||
<syntaxhighlight class="">{ | <syntaxhighlight class="" lang="javascript">{ | ||
cellKey: string, | cellKey: string, | ||
key: string, | key: string, | ||
سطر 784: | سطر 640: | ||
* <code>unregisterAsNestedChild</code> (دالة). تستقبل كائن يحتوي على الخواص التالية: | * <code>unregisterAsNestedChild</code> (دالة). تستقبل كائن يحتوي على الخواص التالية: | ||
<syntaxhighlight class="">{ | <syntaxhighlight class="" lang="javascript">{ | ||
key: string, | key: string, | ||
state: ChildListState | state: ChildListState | ||
}</syntaxhighlight> | }</syntaxhighlight> | ||
* <code>debugInfo</code> (ListDebugInfo) | * <code>debugInfo</code> (ListDebugInfo) | ||
=== <code>()hasMore</code> === | === <code>()hasMore</code> === | ||
<syntaxhighlight class="react">hasMore() => boolean</syntaxhighlight> | <syntaxhighlight class="react" lang="javascript">hasMore() => boolean</syntaxhighlight> | ||
== المصادر == | == المصادر == | ||
[https://reactnative.dev/docs/virtualizedlist صفحة VirtualizedList في توثيق React Native الرسمي.] | [https://reactnative.dev/docs/virtualizedlist صفحة VirtualizedList في توثيق React Native الرسمي.] | ||
[[تصنيف: ReactNatve]] | [[تصنيف: ReactNatve]] |
مراجعة 06:23، 5 مارس 2021
إذا أردت أن تتحصل على مرونة أكبر من التي يوفرها المكونان <FlatList>
و<SectionList>
لطريقة عرض القوائم، فعليك استخدام المكون VirtualizedList،
والذي يوفّر عناصر البناء الرئيسية لعرض القوائم. للاستخدام مع البيانات الغير قابلة للتعديل بدلًا عن المصفوفات العادية على سبيل المثال.
لهذا المكوّن فوائد عديدة حيث أنه يقلّل استهلاك الذاكرة ويحسِّن أداء القوائم كثيرًا من خلال الحفاظ على نافذة عرض محدودة للعناصر النشطة، ويستبدل العناصر الموجودة خارج هذه النافذة بمساحات فارغة بأحجام مناسبة. ويتم عرض العناصر تتابعيًا عند التمرير لأسفل في الشاشة.
مثال
import React from 'react';
import { SafeAreaView, View, VirtualizedList, StyleSheet, Text } from 'react-native';
import Constants from 'expo-constants';
const DATA = [];
const getItem = (data, index) => {
return {
id: Math.random().toString(12).substring(0),
title: `Item ${index+1}`
}
}
const getItemCount = (data) => {
return 50;
}
const Item = ({ title })=> {
return (
<View style={styles.item}>
<Text style={styles.title}>{title}</Text>
</View>
);
}
const VirtualizedListExample = () => {
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: Constants.statusBarHeight,
},
item: {
backgroundColor: '#f9c2ff',
height: 150,
justifyContent: 'center',
marginVertical: 8,
marginHorizontal: 16,
padding: 20,
},
title: {
fontSize: 32,
},
});
export default VirtualizedListExample;
ملاحظات
- عند تمرير المحتوى خارج نافضة العرض، لا يحتفظ المكون
VirtualizedList
بالحالة الخاصة به، لذلك يجب التأكد من حفظها في مخزن خارجي للبيانات مثلFlux
أوRedux
أوRelay
. - يعتبر هذا المكون
PureComponent
، أي أنه لن يعاد رسمه إذا كانت الخاصيَّات متساوية تساويًا سطحيًا (shallow-equal). لذلك يجب التأكد من أن جميع الخاصيات التي تعتمد الدالةrenderItem
عليها قد تم تمريرها كمعاملات لا تساوي قيمتها قيمة الخاصيَّات الحالية للتأكد من تحديث واجهة المستخدم عند تغيير البيانات. - يُعرض المحتوى بطريقة غير متزامنة خارج نافذة العرض، وذلك للحفاظ على مساحة الذاكرة وضمان التمرير السلس، هذا يعي أنه من الممكن ظهور مساحات فارغة للحظات بسيطه قبل ظهور المحتوى عند التمرير بسرعة عالية. ونعمل على تحسين هذا السلوك خلف الكواليس.
- يبحث المكون
VirtualizedList
افتراضيًا عن الخاصيةkey
في كلّ عنصر من العناصر الأبناء.
الخاصيات
يرث خواص المكون ScrollView
.
renderItem
(info: any) => ?React.Element<any>
تأخذ عنصر من data
وتعرضه في القائمة.
النوع | مطلوب |
---|---|
دالة (function) | نعم |
data
مصفوفة من الأصناف يمثِّل كلّ صنف أحد العناصر التي ستُعرض في القائمة، ويكون كلّ صِنف في الشكل {key: string}
افتراضيًا، ويمكن استخدام الخاصيِّات getItem
وgetItemCount
وkeyExtractor
للتعامل مع جميع انواع البيانات المُرتبة.
النوع | مطلوب |
---|---|
<any> | نعم |
getItem
(data: any, index: number) => object;
دالة تمكِّنك من الوصول لعنصر معين من العناصر المحفوظة في الخاصية data
.
النوع | مطلوب |
---|---|
دالة (function) | نعم |
getItemCount
(data: any) => number;
تحسب عدد العناصر الموجودة في المصفوفة data
.
النوع | مطلوب |
---|---|
دالة (function) | نعم |
debug
يظهر المزيد من التفاصيل عن الأخطاء التي تحدث أثناء التعامل مع المكون VirtulizedList
مما يسهل عملية تصحيح الأخطاء (debugging).
النوع | مطلوب |
---|---|
قيمة منطقية (bool) | لا |
extraData
تجبر هذه الخاصية الجهاز على إعادة رسم القائمة عند تغير أي بيانات داخل القائمة. إذا كان هناك عنصر من العناصر التي ستعرض بواسطة الدالة renderItem
يعتمد على بيانات تم تعريفها خارج الخاصية data
، ينبغي إعادة تعريف هذه البيانات داخلها.
النوع | مطلوب |
---|---|
قيمة منطقية (bool) | لا |
getItemLayout
(
data: any,
index: number,
) => {length: number, offset: number, index: number}
النوع | مطلوب |
---|---|
دالة (function) | لا |
initialScrollIndex
بدلًا عن عرض أول عنصر في أعلى القائمة، تحدِّد هذه الخاصية ترتيب العنصر الذي يجب بدء عرضه في بداية القائمة، وذلك عن طريق ايقاف تحسين التمرير الى الأعلى الذي يحافظ على عرض عناصر initialNumToRender
ويُعرض العناصر ابتداءً من أول عنصر في الترتيب، وتتطلّب هذه الخاصية أن تكون الخاصية getItemLayout
مفعّلة.
النوع | مطلوب |
---|---|
عدد (number) | لا |
inverted
تعكس إتجاه التمرير باستخدام تحويلات بمقياس (-1).
النوع | مطلوب |
---|---|
دالة (function) | لا |
CellRendererComponent
تُعرض جميع الخلايا بواسطة هذا العنصر. وقد يكون React Component Class
أو render function
.
والقيمة الإفتراضية له هي المكون View
.
النوع | مطلوب |
---|---|
component, function | لا |
ItemSeparatorComponent
يعرض هذا المكوّن فواصلًا بين العناصر، ويمتلك الخاصيتين highlighted
وleadingItem
إفتراضيًّا.
توفِّر الخاصية renderItem
الخواص separators.highlight
وseparators.unhighlight
واللتان تُستعملان لتحديث قيمة الخاصية highlighted
. يمكن أيضًا إضافة خواص أخرى عن طريق الخاصية separators.updateProps
.
النوع | مطلوب |
---|---|
component, function | لا |
listKey
إذا كان هناك أكثر من قائمة في نفس المستوى (أبناء لعنصر واحد) فيجب تحديد مفتاح مميز لكلّ قائمة.
النوع | مطلوب |
---|---|
سلسلة نصية (string) | لا |
listEmptyComponent
يُعرض هذا المكون عندما تكون القائمة فارغة، وقد يكون مكوِّنًا صنفيًّا (Class component) أو مكونًا دالِّيًا (function componenet) أو عنصرًا.
النوع | مطلوب |
---|---|
component، function، element | لا |
ListItemComponent
مكون يُستخدم لعرض عناصر القائمة، وقد يكون مكونًا كائنيًّأ (Class component) أو دالة عرض.
النوع | مطلوب |
---|---|
component, function | لا |
يُعرض في أسفل القائمة (تذييل للقائمة)، وقد يكون مكوِّنًا صنفيًّا (Class component) أو مكونًا دالِّيًا (function componenet) أو عنصرًا.
النوع | مطلوب |
---|---|
component، function، element | لا |
تُحدد أنماط المكوّن ListFooterComponent
.
النوع | مطلوب |
---|---|
ViewStyleProp
|
لا |
ListHeaderComponenet
يُُعرض في أعلى القائمة، وr$ يكون مكوِّن صنفي (Class component) أو مكون دالِّي (function componenet).
النوع | مطلوب |
---|---|
component، function، element | لا |
ListHeaderComponenetStyle
تُحدد أنماط المكون ListHeaderCompoenet
.
النوع | مطلوب |
---|---|
component، function، element | لا |
onRefresh
() => void
توفِّر RefreshControl
قياسي يُضاف لوظيفة السحب للتحديث (Pull to Refresh)، وعند استخدامها يجب التأكد من ضبط الخاصية refreshing
بطريقة صحيحة.
النوع | مطلوب |
---|---|
دالة (funcion) | لا |
onScrollToIndexFailed
دالة تُستدعى في حالة حدوث خطأ عند التمرير لعنصر معين، فإمّا أن تحسب الإزاحة الخاصة بالعنصر الذي حدث الخطأ عند التمرير إليه وإعادة التمرير إليها مَرةً أخرى، أو التمرير لنهاية القائمة ثم الرجوع لذلك العنصر.
(info: {
index: number,
highestMeasuredFrameIndex: number,
averageItemLength: number,
}) => void
النوع | مطلوب |
---|---|
دالة (funcion) | لا |
onViewableItemsChanged
(info: {
viewableItems: array,
changed: array,
}) => void
دالة تُستدعى عندما تتغير الصفوف المعروضة، كما هي مُعرَّفة بالخاصية ViewabilityConfig
.
النوع | مطلوب |
---|---|
دالة (funcion) | لا |
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
في نفس الزوج.
النوع | مطلوب |
---|---|
(array of (ViewabilityConfigCallbackPair | لا |
horizontal
النوع | مطلوب |
---|---|
قيمة منطقية (bool) | لا |
initialNumToRender
تُحدد عدد العناصر التي ستُعرض في أول دفعة. يجب أن يكون عدد العناصر كافي لملء الشاشة أو أقل من ذلك ولكن يجب أن لا يزيد عن حجم الشاشة.
ملاحظة: لتحسين عملية التمرير لأعلى (Scroll-to-top) يجب ألّا تُحذف هذه العناصر كجزء من إطارات العرض.
النوع | مطلوب |
---|---|
عدد (number) | لا |
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) | لا |
updateCellsBatchingPeriod
تُحدد المدة الزمنية بين عرض دفعات العناصر.
النوع | مطلوب |
---|---|
عدد (number) | لا |
windowSize
تُحدد الحدّ الأقصى من العناصر التي يمكن عرضها خارج المنطقة المرئية. على سبيل المثال إذا كانت القائمة تملأ الشاشة، فستعرض الخاصية windowSize=21
كامل القائمة (المنطقة المرئية) بالإضافة لمساحة 10 شاشات فارغة أعلى القائمة و10 أسفلها.
ملاحظة: القيم الصغيرة لهذه الخاصية تؤدّي لتقليل استهلاك الذاكرة وتحسين الأداء، ولكنها تزيد من احتمالية ظهور مساحات فارغة عند التمرير بسرعة كبيرة.
النوع | مطلوب |
---|---|
عدد (number) | لا |
disableVirtualization
خاصية مهملة: توفِّر المحاكاة الافتراضية تحسينات كبيرة في الأداء والذاكرة إلَّا أنها تلغي تمامًا حالات التفاعل الموجودة خارج نافذة العرض، حيث يجب تعطيل هذه الخاصية فقط أثناء بناء التطبيق وتصحيح الأخطاء.
النوع | مطلوب |
---|---|
لا |
persistentScrollbar
النوع | مطلوب |
---|---|
قيمة منطقية (bool) | لا |
progressViewOffset
اضبط قيمة هذه الخاصية إذا كنت تحتاج لمساحة لعرض مؤشر التحميل.
النوع | مطلوب | نظام التشغيل |
---|---|---|
عدد | لا | أندرويد |
الدوال
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
الإزاحة التي يجب التمرير لها. إذا كانت القائمة أفقية تكون قيمة هذه المعامل على محور (x)، وعلى محور (y) إذا كانت القائمة رأسية. - يُحدد المعامل
animated
ما إذا كانت ستُضاف تأثيرات حركية أثناء عملية التمرير أم لا.
()recordInteraction
recordInteraction();
()flashScrollINdicators
flashScrollIndicators();
getScrollResponder
getScrollResponder() => ?scollResponderType;
()getScrollableNote
getScrollableNode () => ?number;
()getScrollRef
getScrollRef () => | ?React.ElementRef<typeof ScrollView>
| ?React.ElementRef<typeof View>;
()setNativeProps
setNativeProps((props: Object));
()getChildContext
getChildContext() => Object;
يتكون الكائن المُرجع من هذه الدالة من:
VirtualizedList
(كائن). يتكون من:getScrollMetrics
(دالة). تُرجع كائن يحتوي على الخواص التالية:{ contentLength: number, dOffest: number, dt: number, offset: number, timestamp: number, velocity: number, visibleLength: number }
horizontal
(قيمة منطقية) - اختياري-.getOutermostParentListRef
(دالة).getNestedChildState
(دالة) - تُرجعChildListState
.registerAsNestedChild
(دالة). تستقبل كائن يحتوي على الخواص التالية:
{
cellKey: string,
key: string,
ref: VirtualizedList,
parentDebugInfo: ListDebugInfo
}
وتُرجع ChildListState
.
unregisterAsNestedChild
(دالة). تستقبل كائن يحتوي على الخواص التالية:
{
key: string,
state: ChildListState
}
-
debugInfo
(ListDebugInfo)
()hasMore
hasMore() => boolean