الفرق بين المراجعتين ل"ReactNative/sectionlist"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(رفع المحتوى)
سطر 1: سطر 1:
{{DISPLAYTITLE:SectionList في React Native}}
+
<noinclude>{{DISPLAYTITLE:المكون SectionList في ReactNative}}</noinclude>
وهي واجهة عالية الأداء مستخدمة لإظهار القوائم المقسمة، وتمتاز بما يلي:
+
وهي واجهةٌ عالية الأداء لتصيير القوائم المقسّمة، ومن أهمّ ميّزاتها:
  
* دعم كامل للمنصات المتعددة (cross-platform).
+
* منصّةٌ متعدّدةٌ (cross-platform).
* تدعم ضبط استجابات الإظهار.
+
* ردود نداءٍ قابلةٌ للضبط والعرض.
 +
* تدعم ترويسة (header) القائمة.
 
* تدعم تذييل (footer) القائمة.
 
* تدعم تذييل (footer) القائمة.
* تدعم فاصل العناصر.
+
* تدعم فاصل العنصر.
 
* تدعم ترويسة القسم.
 
* تدعم ترويسة القسم.
 
* تدعم فاصل الأقسام.
 
* تدعم فاصل الأقسام.
* تدعم إظهار العناصر والمعطيات الغير متجانسة (Heterogeneous).
+
* تدعم تصيير العناصر والمعطيات غير المتجانسة (Heterogeneous).
 
* تدعم السحب للتحديث (Pull to Refresh).
 
* تدعم السحب للتحديث (Pull to Refresh).
* تدعم تحميل التمرير (Scroll loading).
+
* تدعم تحميل التّمرير (Scroll loading).
  
يمكن استخدام واجهة أبسط مثل <code>[[ReactNative/flatlist|FlatList]]</code> عند عدم الحاجة لدعم الأقسام.  
+
يمكن استخدام واجهة أبسط مثل [https://reactnative.dev/docs/flatlist <code>FlatList</code>] عند عدم الحاجة لدعم الأقسام.  
 +
__toc__
 +
== مثال ==
  
== مثال ==
+
* مثال لمكوِّن الدالّة (Function Component)
  
* مثال لمكوِّن دالّي (Function Component)
+
<syntaxhighlight lang="javascript">import React from "react";
<syntaxhighlight lang="javascript">
 
import React from "react";
 
 
import {
 
import {
 
   StyleSheet,
 
   StyleSheet,
سطر 86: سطر 87:
 
});
 
});
  
export default App;
+
export default App; </syntaxhighlight>
 
+
* مثال لمكوِّن الصنف (Class Component)
</syntaxhighlight>
 
  
* مثال لمكوِّن صنفي (Class Component)
+
<syntaxhighlight lang="javascript">import React, { Component } from "react";
<syntaxhighlight lang="javascript">
 
import React, { Component } from "react";
 
 
import {
 
import {
 
   StyleSheet,
 
   StyleSheet,
سطر 164: سطر 162:
 
});
 
});
  
export default App;
+
export default App; </syntaxhighlight>
 +
يعد هذا المكون غلافًا ملائمًا للمكوّن الأساسيّ [https://reactnative.dev/docs/virtualizedlist <code>VirtualizedList</code>], لذا يرث خاصّيّاته (كذلك خاصّيّات [https://wiki.hsoub.com/ReactNative/scrollview <code>ScrollView</code>]) مع مراعاة ما يلي:
 +
 
 +
* لا تُحفظ الحالة الداخلية عند تمرير المحتوى خارج نافذة التصيير، لذا يجب التأكد من حفظ البيانات ضمن عنصر البيانات أو في المخازن الخارجية مثل Flux أو Redux أو Relay.
 +
* إن هذا المكوّن من النوع الصافي <code>PureComponent</code> أي أنّه لن يُعاد تصييره عندما تبقى قيم الخاصيات <code>Props</code> متساويةً سطحيًا (shallow-equal)، لذا يجب التأكد من أن كلّ ما تعتمد عليه الدّالة <code>renderItem</code> يمرّر لها كخاصّيّةٍ (مثل <code>extraData</code>) لا تحتوي على المساواة ا
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
 
 +
لصارمة <code>===</code> بعد التحديثات، وإلا فلن تُحدّث الواجهة عند التّغيير، وهذا يتضمّن الخاصيّة <code>data</code> وحالة المكوّن الأب.
  
</syntaxhighlight>يعد هذا المكون تغليف ملائمة (convenience wrapper) حول المكون الأساسي <code>[[ReactNative/virtualizedlist|VirtualizedList]]</code>، لذا فإن خاصياته موروثة منه (كذلك من المكوّن <code>[[ReactNative/scrollview|ScrollView]]</code>) مع مراعاة ما يلي:
+
* يصيّر المحتوى بشكلٍ غير متزامنٍ خارج نافذة الواجهة، وذلك لتقييد الذاكرة وتأمين تمريرٍ سلسٍ، مما يعني أنه يمكن التمرير أسرع من معدّل التعبئة (fill rate) مما يؤدي لظهور محتوىً فارغٍ للحظة، وهذا عبارة عن مقايضة (tradeoff) يمكن تعديلها لتناسب احتياجات كلّ تطبيق، ونعمل على تحسينه حاليًّأ.
 +
* تبحث القائمة -بشكلٍ افتراضيٍّ- عن الخاصيّة <code>key</code> لكل عنصر لتستخدمها كمفتاح React، غير أنه يمكن استخدام الخاصيّة <code>keyExtractor</code> المخصّصة بشكلٍ بديلٍ.
  
* إن الحالة الداخلية غير محفوظة عند تمرير المحتوى خارج نافذة الإظهار، لذا يجب التأكد من حفظ البيانات ضمن عنصر البيانات أو في المخازن الخارجية مثل <code>Flux</code> أو <code>Redux</code> أو <code>Relay</code>.
+
== الخاصيات ==
* إن هذا المكوّن من النوع الصافي <code>PureComponent</code>، مما يعني أنه لن يتم تحديث الإظهار في حال بقيت قيمة الخاصيات مساوية سطحيًا (shallow-equal) لقيمها السابقة. لذا يجب التأكد من أن كل شيء يتم تمريره كخاصيّة للدالة <code>renderItem</code> لا يحتوي على المساواة السطحية <code>===</code> بعد التحديثات، وإلا فإن الواجهة لن تُحدّث أثناء التغيير. ويتضمن هذا الخاصيّة <code>data</code> ومكوّن الحالة الأب.
 
* يظهر المحتوى بشكل غير متزامن خارج نافذة الإظهار، وذلك لتقييد الذاكرة ولتأمين سلاسة في التمرير. مما يعني أنه يمكن التمرير أسرع من معدّل التعبئة (fill rate) مما يؤدي لظهور محتوى فارغ لحظيًا. وهذا عبارة عن مقايضة (tradeoff) يمكن تعديلها لتناسب احتياجات كل تطبيق.
 
* تبحث القائمة بشكل افتراضي عن الخاصيّة <code>key</code> ضمن كل عنصر لتستخدمها كمفتاح React، غير أنه يمكن بشكل بديل استخدام الخاصيّة <code>keyExtractor</code> لإدخال مفتاح شخصي.
 
  
== الخاصيّات (Props) ==
+
موروثة من الخاصيّات [https://wiki.hsoub.com/ReactNative/scrollview#props <code>ScrollView Props</code>].
موروثة من الخاصيّات <code>[[ReactNative/scrollview|ScrollView]]</code>.
 
  
 
=== <code>renderItem</code> ===
 
=== <code>renderItem</code> ===
المُظهِر الافتراضي لكل عنصر في كل قسم، وهذا المظهر هو عبارة عن دالة تعيد عنصر React.
+
 
 +
المُصيّر الافتراضي لكل عنصرٍ في كلّ قسمٍ، ويمكن تجاوزها عل أساس كلّ قسم، ويجب أن تعيد عنصر React.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|كائن (object)
+
| دالة (function)
|لا
+
| نعم
 
|}
 
|}
يُمرَّر لدالة الإظهار كائن مع المفاتيح التالية:
 
  
* <code>item</code> (كائن) - كائن العنصر والمحدد في <code>data</code> الخاصة بالقسم.
+
تمرَّر دالة التصيير ككائن له المفاتيح التالية:
* <code>index</code> (عدد) - دليل العنصر داخل القسم.  
+
 
* <code>section</code> (كائن) - كائن القسم الكامل والمحدد في <code>sections</code>.  
+
* 'item' (كائن): كائن العنصر والمحدد في المفتاح <code>data</code> الخاصّ بالقسم.  
* <code>separator</code> (كائن) - كائن له المفاتيح التالية:
+
* 'index' (عدد): دليل العنصر في القسم.  
**<code>highlight</code> (دالة) - <code>() => void</code>.
+
* 'section' (كائن): كائن القسم الكامل كما هو محدّدٌ في <code>sections</code>.  
** <code>unhighlight</code> (دالة) - <code>() => void</code>.  
+
* 'separator' (كائن): كائن له المفاتيح التالية:
** <code>updateProps</code> (دالة) - <code>(select، newProps) => void</code>.  
+
** 'highlight' (دالة): <code>() =&gt; void</code>.  
*** <code>select</code> (قيمة اسمية) - قيمها المحتملة <code>leading</code> أو <code>trailing</code>.
+
** 'unhighlight' (دالة): <code>() =&gt; void</code>.  
*** <code>newProps</code> (كائن).
+
** 'updateProps' (دالة): <code>(select, newProps) =&gt; void</code>.  
 +
*** 'select' (قيمة متعدّدة): قيمها المحتملة 'leading' أو 'trailing'.
 +
*** 'newProps' (كائن).
 +
 
 +
=== <code>sections</code> ===
 +
 
 +
تمثّل البيانات الفعلية تصييرها، كما هو الحال مع الخاصيّة <code>data</code> في [https://reactnative.dev/docs/flatlist <code>FlatList</code>].
  
===<code>sections</code>===
 
تمثّل البيانات الفعلية للإظهار، كما هو الحال مع الخاصيّة <code>data</code> في <code>[[ReactNative/flatlist|FlatList]]</code>.
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|مصفوفة من الأقسام (array of sections)
+
| مصفوفة من الأقسام (array of sections)
|نعم
+
| نعم
 
|}
 
|}
  
===<code>extraData</code>===
+
=== <code>extraData</code> ===
تتضمن البيانات الإضافية التي تحتاجها دوال الإظهار (<code>renderItem</code> والترويسة والتذييل وغيرها) والغير موجودة في <code>data</code>.
+
 
 +
خاصّيّةٌ تبيّن للقائمة حاجتها لإعادة التصيير (على اعتبار أنها تنفّذ <code>PureComponent</code>)، وتوضع فيها المعلومات التي تحتاجها الدوال (<code>renderItem</code> والترويسة والتذييل وغيرها) وهي غير موجودةٍ في الخاصية <code>data</code>.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|أي شيء (any)
+
| أي شيء (any)
|لا
+
| لا
 
|}
 
|}
  
===<code>initialNumToRender</code>===
+
=== <code>initialNumToRender</code> ===
تحدد عدد العناصر الواجب إظهارها في الدفعة الأولى لتملأ الشاشة لا أكثر.
+
 
 +
تحدد عدد العناصر المصيّرة في الدفعة الأولى، والتي ستكون كافيةً لملء الشاشة لا أكثر، مع ملاحظة أن لن يتم استبدال عناصر الواجهة الأولى كجزء من عملية التصيير بالنوافذ (windowed rendering، يتم فيه استبدال عناصر نافذة الواجهة الحالية بعناصر النافذة التالية أثناء التمرير لتحسين الأداء)، وذلك للمحافظة على فاعلية التمرير للأعلى.  
  
'''ملاحظة:''' لن يتم استبدال عناصر الإظهار الأولى في الإظهار بالنوافذ (يتم فيه استبدال عناصر نافذة الإظهار الحالية بعناصر النافذة التالية أثناء التمرير وذلك لتحسين الأداء)، وذلك للمحافظة على فاعلية التمرير للأعلى.  
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|عدد (number)
+
| عدد (number)
|لا
+
| لا
 
|}
 
|}
  
===<code>inverted</code>===
+
=== <code>inverted</code> ===
تعكس اتجاه التمرير باستخدام تحويل مقياس الرسم ذي القيمة <code>1-</code>. 
+
 
 +
تقوم بعكس اتجاه التّمرير، باستخدام تحويل مقياس الرسم ذي القيمة 1-.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|قيمة منطقية (boolean)
+
| قيمة منطقية (boolean)
|لا
+
| لا
 
|}
 
|}
  
===<code>ItemSeparatorComponent</code>===
+
=== <code>ItemSeparatorComponent</code> ===
يُظهَر هذا المكوّن بين العناصر ولكن ليس في الأعلى أو الأسفل، ويزوَّد بشكل افتراضي بالخاصيات <code>highlighted</code> و <code>section</code> و <code>[leading/trailing][Item/Section]</code>. كما تتضمن دالة الإظهار <code>renderItem</code> على <code>separators.highlight</code> و <code>separators.unhighlight</code> والمستخدمة لتحديث الخاصيّة <code>highlighted</code>، غير أنه من الممكن إضافة خاصيات شخصية مع <code>separators.</code> <code>updateProps</code>.
+
 
 +
يُصيّر بين العناصر، ولكن لا في الأعلى أو الأسفل، ويزوَّد بشكلٍ افتراضيٍّ بالخاصيات <code>highlighted</code> و <code>section</code> و <code>[leading/trailing][Item/Section]</code>، كما تحتوي الدالة <code>renderItem</code> الخاصة بالواجهة View على <code>separators.highlight</code> و <code>separators.unhighlight</code> والمستخدمة لتحديث الخاصيّة <code>highlighted</code>، كما يمكن إضافة خاصيات مخصّصةٌ في <code>separators. updateProps</code>.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|عنصر، دالة، مكون (component, function, element)
+
| عنصر، دالة، مكوّن (component, function, element)
|لا
+
| لا
 
|}
 
|}
  
===<code>keyExtractor</code>===
+
=== <code>keyExtractor</code> ===
تُستخدم لاستخراج مفتاح فريد للعنصر المعطى وفق الدليل المحدد، حيث يُستخدم هذا المفتاح من أجل التخزين المؤقت (caching) ومن أجل تعقّب إعادة ترتيب العنصر. يتفحّص المستخرج الافتراضي <code>item.key</code> ثم يعود لاستخدام الدليل، بشكل مماثل لتوثيق React.  
+
 
 +
تُستخدم لاستخراج مفتاح فريد للعنصر المعطى وفق الدليل المحدّد، حيث يُستخدم هذا المفتاح للتّخزين المؤقّت (caching) ولتعقّب إعادة طلب العنصر، يتفحّص المستخرج الافتراضيّ <code>item.key</code> ثم يعود لاستخدام الدليل -كما يفعل React-، مع ملاحظة أن هذا المستخرج يحدّد مفاتيحًا لكلّ عنصر، ولا يزال كل قسمٍ عامٍّ بحاجةٍ لمفتاح خاصٍّ.
  
'''ملاحظة:''' يضع هذا المستخرج مفتاح لكل عنصر، غير أن كل قسم كامل مازال بحاجة لمفتاحه الخاص.
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|سلسلة نصية (<code>(item: Item, index: number) => string</code>)
+
| سلسلة نصية ((item: Item, index: number) =&gt; string)
|نعم
+
| نعم
 
|}
 
|}
  
 
=== <code>ListEmptyComponent</code> ===
 
=== <code>ListEmptyComponent</code> ===
يُظهَر هذا المكوّن عندما تكون القائمة فارغة، ويمكن أن يكون صنف مكوّن React أو دالة إظهار أو العنصر المُظهَر.
+
 
 +
تصيّر عندما تكون القائمة فارغةً، ويمكن أن يكون صنف مكوّن React أو دالة تصيير أو العنصر المُصيّر.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|عنصر، دالة، مكون (component, function, element)
+
| عنصر، دالة، مكون (component, function, element)
|لا
+
| لا
 
|}
 
|}
  
===<code>ListFooterComponent</code>===
+
=== <code>ListFooterComponent</code> ===
يُظهَر هذا المكوّن في آخر القائمة، ويمكن أن يكون صنف مكوّن React أو دالة إظهار أو العنصر المُظهَر.
+
 
 +
يصيّر في آخر القائمة، ويمكن أن يكون صنف مكوّن React أو دالة تصيير أو العنصر المُصيّر.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|عنصر، دالة، مكون (component, function, element)
+
| عنصر، دالة، مكون (component, function, element)
|لا
+
| لا
 
|}
 
|}
  
===<code>ListHeaderComponent</code>===
+
=== <code>ListHeaderComponent</code> ===
يُظهَر هذا المكوّن في بداية القائمة، ويمكن أن يكون صنف مكوّن React أو دالة إظهار أو العنصر المُظهَر.
+
 
 +
يُصيّر في بداية القائمة، ويمكن أن يكون صنف مكوّن React أو دالة تصيير أو العنصر المُصيّر.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|عنصر، دالة، مكون (component, function, element)
+
| عنصر، دالة، مكون (component, function, element)
|لا
+
| لا
 
|}
 
|}
  
===<code>onEndReached</code>===
+
=== <code>onEndReached</code> ===
تُستدعى عند وصول موقع التمرير إلى العتبة <code>onEndReachedThreshold</code> في المحتوى المُظهَر.
+
 
 +
تُستدعى عند وصول موقع التمرير إلى الخاصّية <code>onEndReachedThreshold</code> في المحتوى المُصيّر.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|معلومات (<code>(info: {distanceFromEnd: number}) => void</code>)
+
| معلومات ((info: {distanceFromEnd: number}) =&gt; void)
|لا
+
| لا
 
|}
 
|}
  
===<code>onEndReachedThreshold</code>===
+
=== <code>onEndReachedThreshold</code> ===
تحدد مسافة أسفل المحتوى المرئي عن أسفل القائمة نسبة إلى طول القسم المرئي من القائمة والتي يجب عندها إطلاق الاستجابة <code>onEndReached</code>، لذا ستُطلق القيمة <code>0.5</code> الاستجابة <code>onEndReached</code> عندما تصبح نهاية المحتوى الظاهر ضمن منتصف الطول المرئي من القائمة.  
+
 
 +
تحدّد كم يجب أن يكون بعد الحافة السفلى للقائمة (بوحدات طول القائمة المرئيّ) عن نهاية المحتوى والتي سيطلق عندها رد النداء <code>onEndReached</code>، لذا ستُطلق القيمة 0.5 الاستجابة <code>onEndReached</code> عندما تكون نهاية المحتوى في حدود منتصف طول القائمة المرئيّ.  
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|عدد (number)
+
| عدد (number)
|لا
+
| لا
 
|}
 
|}
  
===<code>onRefresh</code>===
+
=== <code>onRefresh</code> ===
تُضيف التحكم بالتحديث المعياري (standard RefreshControl) لوظيفة السحب للتحديث (Pull to Refresh)، كما يجب ضبط الخاصيّة <code>refreshing</code> بشكل صحيح. فمثلا توضع القيمة <code>progressViewOffset={100}</code> لجعل إزاحة التحكم بالتحديث 100 نقطة (pt) من أعلى القائمة.
+
 
 +
تُضيف تحكّمًا معياريًّا بالتحديث (standard RefreshControl) لوظيفة السحب للتحديث (Pull to Refresh)، كما يجب ضبط الخاصيّة <code>refreshing</code> بشكلٍ صحيحٍ، فمثلًا لإزاحة التحكم بالتحديث 100 نقطة (pt) من أعلى القائمة نضع القيمة <code>progressViewOffset={100}</code>.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|<code>[() => void]</code>
+
| [() =&gt; void]
|لا
+
| لا
 
|}
 
|}
  
===<code>onViewableItemsChanged</code>===
+
=== <code>onViewableItemsChanged</code> ===
تُستدعى هذه الدالة عند تغيّر قابلية إظهار السطور والمعرّفة بالخاصيّة <code>viewabilityConfig</code>.
+
 
 +
تُستدعى عند تغيّر قابلية إظهار السطور، والمعرّفة بالخاصيّة <code>viewabilityConfig</code>.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|دالة (function)
+
| دالة (function)
|لا
+
| لا
 
|}
 
|}
 +
 
يُمرر لهذه الدالة كائن له المفاتيح التالية:
 
يُمرر لهذه الدالة كائن له المفاتيح التالية:
  
* <code>viewableItems</code> (مصفوفة من <code>ViewToken</code>)
+
* 'viewableItems' (مصفوفة من <code>ViewToken</code>)
* <code>changed</code> (مصفوفة من <code>ViewToken</code>)
+
* 'changed' (مصفوفة من <code>ViewToken</code>)
  
 
يُصدَّر النوع <code>ViewToken</code> عن طريق <code>ViewabilityHelper.js</code>:
 
يُصدَّر النوع <code>ViewToken</code> عن طريق <code>ViewabilityHelper.js</code>:
 +
 
{| class="wikitable"
 
{| class="wikitable"
!الاسم
+
! الاسم
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|<code>item</code>
+
| item
|أي نوع (any)
+
| أي نوع (any)
|نعم
+
| نعم
 
|-
 
|-
|<code>key</code>
+
| key
|سلسلة نصية (string)
+
| سلسلة نصية (string)
|نعم
+
| نعم
 
|-
 
|-
|<code>index</code>
+
| index
|عدد (number)
+
| عدد (number)
|لا
+
| لا
 
|-
 
|-
|<code>isViewable</code>
+
| isViewable
|قيمة منطقية (boolean)
+
| قيمة منطقية (boolean)
|نعم
+
| نعم
 
|-
 
|-
|<code>section</code>
+
| section
|أي نوع (any)
+
| أي نوع (any)
|لا
+
| لا
 
|}
 
|}
<code>refreshing</code>
 
  
تُضبط بالقيمة <code>true</code> لانتظار البيانات الجديدة من أجل التحديث.
+
=== <code>refreshing</code> ===
 +
 
 +
تُضبط بالقيمة <code>true</code> لانتظار البيانات الجديدة من التحديث.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|قيمة منطقية (bool)
+
| قيمة منطقية (bool)
|لا
+
| لا
 
|}
 
|}
  
===<code>removeClippedSubview</code>===
+
=== <code>removeClippedSubview</code> ===
تُستخدم لتحسين أداء التمرير في القوائم الطويلة.
+
 
 +
تُستخدم لتحسين أداء التمرير في القوائم الطويلة، مع ملاحظة إمكانية ظهور بعض العيوب أحيانًا (كالمحتوى مفقود) لذا استخدمها على مسؤوليّتك الشخصيّة.
  
'''تنبيه:''' تظهر فيها أحيانًا بعض العيوب مثل المحتوى مفقود، لذا استخدمها على مسؤوليتك الشخصية.
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|قيمة منطقية (bool)
+
| قيمة منطقية (bool)
|لا
+
| لا
 
|}
 
|}
  
===<code>renderSectionFooters</code>===
+
=== <code>renderSectionFooters</code> ===
يُظهَر أسفل كل قسم.
+
 
 +
يُصيّر أسفل كلّ قسم.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|عنصر (<code>(info: {section: SectionT}) => ?React.Element<any></code>)
+
| عنصر ((info: {section: SectionT}) =&gt; ?React.Element<any>)
|لا
+
| لا
 
|}
 
|}
  
===<code>renderSectionHeader</code>===
+
=== <code>renderSectionHeader</code> ===
يُظهَر أعلى كل قسم. كما تلتصق بأعلى عرض التمرير (<code>ScrollView</code>) بشكل افتراضي على منصّة iOS، انظر الخاصيّة <code>stickySectionHeadersEnabled</code>.
+
 
 +
يُصيّر أعلى كلّ قسمٍ، كما تثبت أعلى عرض التمرير (<code>ScrollView</code>) بشكلٍ افتراضيٍ على منصّة iOS، يمكن مراجعة الخاصيّة <code>stickySectionHeadersEnabled</code>.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|عنصر (<code>(info: {section: SectionT}) => ?React.Element<any></code>)
+
| عنصر ((info: {section: SectionT}) =&gt; ?React.Element<any>)
|لا
+
| لا
 
|}
 
|}
  
===<code>SectionSeparatorComponent</code>===
+
=== <code>SectionSeparatorComponent</code> ===
يُظهَر هذا المكوّن في أعلى وأسفل كل قسم (يختلف عن المكوّن <code>ItemSeparatorComponent</code> الذي يُظهَر بين العناصر فقط)، ومخصص لفصل الأقسام عن الترويسات التي في الأعلى والأسفل، ولها نفس استجابة الإبراز (highlight) كما هو الحال مع المكوّن <code>ItemSeparatorComponent</code>. كما يستقبل الخاصيات <code>highlighted</code> و <code>[leading/trailing][Item/Section]</code>، وأية خاصيات شخصية من <code>separators.updateProps</code>.
+
 
 +
يُصيَّر أعلى وأسفل كلّ قسمٍ (يختلف عن المكوّن <code>ItemSeparatorComponent</code> الذي يُصيَّر بين العناصر فقط)، وهو مخصّصٌ لفصل الأقسام عن الترويسات الموجودة في الأعلى والأسفل، ولها نفس استجابة التمييز (highlight) كما هو الحال مع المكوّن <code>ItemSeparatorComponent</code>. كما يستقبل الخاصيات <code>highlighted</code> و <code>[leading/trailing][Item/Section]</code>, وأية خاصيات مخصّصة من <code>separators. updateProps</code>.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|صنف React
+
| صنف React
|لا
+
| لا
 
|}
 
|}
  
===<code>stickySectionHeadersEnabled</code>===
+
=== <code>stickySectionHeadersEnabled</code> ===
تجعل ترويسة القسم تلتصق بأعلى الشاشة حتى تأتي الترويسة التالية وتزيحها، ومفعّلة بشكل افتراضي على منصّة iOS.
+
 
 +
تثبّت ترويسة القسم أعلى الشاشة حتى تأتي الترويسة التالية وتحلّ محلّها، ومفعّلة بشكلٍ افتراضيٍّ على منصّة iOS.
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
!مطلوب
+
! مطلوب
 
|-
 
|-
|قيمة منطقية (bool)
+
| قيمة منطقية (bool)
|لا
+
| لا
 
|}
 
|}
  
== التوابع (Methods) ==
+
== التوابع ==
  
=== <code>()scrollToLocation</code> ===
+
=== <code>scrollToLocation()</code> ===
<syntaxhighlight lang="javascript">
+
 
scrollToLocation(params);
+
<syntaxhighlight lang="javascript">scrollToLocation(params);</syntaxhighlight>
</syntaxhighlight>يمرَّر إلى العنصر المحدد بالخاصيتين <code>sectionIndex</code> و <code>itemIndex</code> (ضمن القسم)، والمتوضّع في المنطقة المرئية بناء على الخاصيّة <code>viewPosition</code>، فإذا كانت قيمتها <code>0</code> فإن العنصر يتوضّع في الأعلى وإذا كانت قيمتها <code>1</code> فإنه يتوضّع في الأسفل وإن كانت <code>0.5</code> فإنه يتوضّع في المنتصف.  
+
يمرر إلى العنصر المحدّد بالخاصيتين <code>sectionIndex</code> و <code>itemIndex</code> (ضمن القسم)، والمتوضّع في المنطقة المرئية فمثلًا إذا كانت الخاصيّة <code>viewPosition</code> تساوي 0 فسيتوضّع العنصر في الأعلى (ويمكن أن تغطيه الترويسة الثابتة)، أما إذا كانت قيمتها 1 فسيتوضّع في الأسفل، وإذا كانت 0.5 فسيتوضّع في المنتصف.
 +
 
 +
'''ملاحظة:''' لا يمكن التمرير لموقع خارج نافذة التصيير دون تحديد الخاصيّة <code>getItemLayout</code> أو <code>onScrollToIndexFailed</code>.
  
'''ملاحظة:''' لا يمكن التمرير لموقع خارج نافذة الإظهار من دون تحديد الخاصيّة <code>getItemLayout</code> أو <code>onScrollToIndexFailed</code>.
 
 
{| class="wikitable"
 
{| class="wikitable"
!الاسم
+
! الاسم
!النوع
+
! النوع
!مطلوب
+
! مطلوب
!الوصف
+
! الوصف
 
|-
 
|-
|<code>params</code>
+
| params
|كائن (object)
+
| كائن (object)
|نعم
+
| نعم
|انظر في الأسفل
+
| انظر في الأسفل
 
|}
 
|}
 +
 
مفاتيح الكائن <code>params</code>:
 
مفاتيح الكائن <code>params</code>:
  
* <code>animated</code> (قيمة منطقية) - تحدد فيما إذا كانت القائمة ستتحرك أثناء التمرير، وقيمتها الافتراضية <code>true</code>.
+
* 'animated' (قيمة منطقية): تحدد فيما إذا كانت القائمة ستتحرك أثناء التمرير، وقيمتها الافتراضية <code>true</code>.  
* <code>itemIndex</code> (عدد) - دليل العنصر الذي سيُمرر إليه داخل القسم. مطلوب.  
+
* 'itemIndex' (عدد): دليل العنصر الذي سيُمرر إليه داخل القسم. مطلوب.  
* <code>sectionIndex</code> (عدد) - دليل القسم الذي يحتوي على العنصر الذي سيُمرر إليه. مطلوب.
+
* 'sectionIndex' (عدد): دليل القسم الذي يحتوي على العنصر الذي سيُمرر إليه. مطلوب.
* <code>viewOffset</code> (عدد) - عدد ثابت من البكسلات لتحديد إزاحة عن الموقع المطلوب.  
+
* 'viewOffset' (عدد): عدد ثابت من البكسلات لإزاحة الموقع النهائي المطلوب، مثلًا بالموازنة مع الترويسات المثبتة.
* <code>viewPosition</code> (عدد) - إذا كانت قيمتها <code>0</code> فإن العنصر المطلوب يتوضع في الأعلى وإذا كانت قيمتها <code>1</code> فإنه يتوضّع في الأسفل وإن كانت <code>0.5</code> فإنه يتوضّع في المنتصف.  
+
* 'viewPosition' (عدد): إذا كانت قيمتها <code>0</code> فسيتوضع العنصر المطلوب في الأعلى، وإذا كانت قيمتها <code>1</code> فسيتوضّع في الأسفل، وإن كانت <code>0.5</code> فسيتوضّع في المنتصف.  
 +
 
 +
=== <code>recordInteraction()</code> ===
  
=== <code>()recordInteraction</code> ===
+
<syntaxhighlight lang="javascript">recordInteraction(); </syntaxhighlight>
<syntaxhighlight lang="javascript">
+
يخبر القائمة بحدوث تفاعل لتقوم بإطلاق حسابات قابلية الإظهار، مثلًا إذا كانت قيمة <code>waitForInteractions</code> مساويةً true ولم يقم المستخدم بالتمرير، يستدعى هذا التابع عادة عند النقر على العنصر أو عند التنقّل.
recordInteraction();
 
</syntaxhighlight>يخبر القائمة بحدوث التفاعل لتقوم بإطلاق حسابات الإظهار، فمثلًا إذا كان المعامل <code>waitForInteractions</code> بالقيمة <code>true</code> فهذا يعني بأن المستخدم لم يمرر بعد. يستدعى هذا التابع عادة عند النقر على العنصر أو عند التنقّل.
 
  
=== <code>()flashScrollIndicators</code> ===
+
=== <code>flashScrollIndicators()</code> ===
<syntaxhighlight lang="javascript">
 
flashScrollIndicators();
 
</syntaxhighlight>يُظهر مؤشرات التمرير لحظيًا، ويعمل على منصًة iOS فقط.
 
  
== تعريفات النوع (Type Definitions) ==
+
<syntaxhighlight lang="javascript">flashScrollIndicators();</syntaxhighlight>
 +
يُظهر مؤشرات التمرير بشكلٍ لحظيٍ، ويعمل على منصًة iOS فقط.
 +
 
 +
== تعريفات النمط  ==
 +
 
 +
=== <code>Section</code> ===
 +
 
 +
كائن معرّف للمعطيات التي ستُصير في قسمٍ معطىً.
  
=== <code>'''Section'''</code> ===
 
كائن معرّف للمعطيات التي ستُظهَر في القسم.
 
 
{| class="wikitable"
 
{| class="wikitable"
!النوع
+
! النوع
 
|-
 
|-
|أي نوع (any)  
+
| أي نوع (any)
 
|}
 
|}
  
==== الخصائص (Properties) ====
+
== الخصائص ==
 +
 
 
{| class="wikitable"
 
{| class="wikitable"
!الاسم
+
! الاسم
!النوع
+
! النوع
!الوصف
+
! الوصف
 
|-
 
|-
|<code>data</code>
+
| <code>data</code>
|مصفوفة (array)
+
| مصفوفة (array)
|معطيات لإظهار العناصر في القسم، وهي مصفوفة من الكائنات مثل الخاصية <code>[[ReactNative/flatlist#data|FlatList's data prop]]</code>
+
| معطيات لتصيير العناصر في القسم، وهي مصفوفة من الكائنات مثل الخاصية [https://reactnative.dev/docs/flatlist#data <code>FlatList's data prop</code>]
 
|-
 
|-
|<code>[key]</code>
+
| <code>key</code>
|سلسلة نصية (string)
+
| سلسلة نصية (string)
|مفتاح اختياري لتعقب إعادة ترتيب الأقسام، ويستخدم دليل الأقسام بشكل افتراضي عند عدم استخدام هذا المفتاح
+
| مفتاح اختياري لتعقب إعادة ترتيب الأقسام، ويستخدم دليل الأقسام بشكلٍ افتراضيٍ عند عدم استخدام هذا المفتاح
 
|-
 
|-
|<code>[renderItem]</code>
+
| <code>renderItem</code>
|عنصر، دالة، مكون (component, function element)
+
| دالة (function)
|لتحديد مُظهر اختياري لعناصر القسم بدل المُظهر الافتراضي <code>renderItem</code>
+
| لتحديد مُصيرٍ اختياريٍّ لعناصر القسم بدل المُصير الافتراضي <code>renderItem</code>
 
|-
 
|-
|<code>[ItemSeparatorComponent]</code>
+
| <code>ItemSeparatorComponent</code>
|قيمة منطقية (boolean)
+
| عنصر، دالة، مكون (component, function, element)
|لتحديد فاصل اختياري لعناصر القسم بدل الفاصل الافتراضي <code>ItemSeparatorComponent</code>  
+
| لتحديد فاصل اختياري لعناصر القسم بدل الفاصل الافتراضي <code>ItemSeparatorComponent</code>
 
|-
 
|-
|<code>[keyExtractor]</code>
+
| <code>keyExtractor</code>
|دالة (function)
+
| دالة (function)
|لتحديد مستخرج مفتاح اختياري للقسم بدل المستخرج الافتراضي <code>keyExtractor</code>  
+
| لتحديد مستخرج مفتاح اختياري للقسم بدل المستخرج الافتراضي <code>keyExtractor</code>
 
|}
 
|}
  
 
== مصادر ==
 
== مصادر ==
  
* [https://reactnative.dev/docs/sectionlist صفحة SectionList في توثيق React Native الرسمي.]
+
* [https://facebook.github.io/react-native/docs/sectionlist صفحة SectionList في توثيق React Native الرسميّ]
 
[[تصنيف:ReactNative]]
 
[[تصنيف:ReactNative]]

مراجعة 08:11، 19 فبراير 2021

وهي واجهةٌ عالية الأداء لتصيير القوائم المقسّمة، ومن أهمّ ميّزاتها:

  • منصّةٌ متعدّدةٌ (cross-platform).
  • ردود نداءٍ قابلةٌ للضبط والعرض.
  • تدعم ترويسة (header) القائمة.
  • تدعم تذييل (footer) القائمة.
  • تدعم فاصل العنصر.
  • تدعم ترويسة القسم.
  • تدعم فاصل الأقسام.
  • تدعم تصيير العناصر والمعطيات غير المتجانسة (Heterogeneous).
  • تدعم السحب للتحديث (Pull to Refresh).
  • تدعم تحميل التّمرير (Scroll loading).

يمكن استخدام واجهة أبسط مثل FlatList عند عدم الحاجة لدعم الأقسام.

مثال

  • مثال لمكوِّن الدالّة (Function Component)
import React from "react";
import {
  StyleSheet,
  Text,
  View,
  SafeAreaView,
  SectionList
} from "react-native";
import Constants from "expo-constants";

const DATA = [
  {
    title: "Main dishes",
    data: ["Pizza", "Burger", "Risotto"]
  },
  {
    title: "Sides",
    data: ["French Fries", "Onion Rings", "Fried Shrimps"]
  },
  {
    title: "Drinks",
    data: ["Water", "Coke", "Beer"]
  },
  {
    title: "Desserts",
    data: ["Cheese Cake", "Ice Cream"]
  }
];

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

const App = () => (
  <SafeAreaView style={styles.container}>
    <SectionList
      sections={DATA}
      keyExtractor={(item, index) => item + index}
      renderItem={({ item }) => <Item title={item} />}
      renderSectionHeader={({ section: { title } }) => (
        <Text style={styles.header}>{title}</Text>
      )}
    />
  </SafeAreaView>
);

const styles = StyleSheet.create({
  container: {
    flex: 1,
    marginTop: Constants.statusBarHeight,
    marginHorizontal: 16
  },
  item: {
    backgroundColor: "#f9c2ff",
    padding: 20,
    marginVertical: 8
  },
  header: {
    fontSize: 32,
    backgroundColor: "#fff"
  },
  title: {
    fontSize: 24
  }
});

export default App;
  • مثال لمكوِّن الصنف (Class Component)
import React, { Component } from "react";
import {
  StyleSheet,
  Text,
  View,
  SafeAreaView,
  SectionList
} from "react-native";
import Constants from "expo-constants";

const DATA = [
  {
    title: "Main dishes",
    data: ["Pizza", "Burger", "Risotto"]
  },
  {
    title: "Sides",
    data: ["French Fries", "Onion Rings", "Fried Shrimps"]
  },
  {
    title: "Drinks",
    data: ["Water", "Coke", "Beer"]
  },
  {
    title: "Desserts",
    data: ["Cheese Cake", "Ice Cream"]
  }
];

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

class App extends Component {
  render() {
    return (
      <SafeAreaView style={styles.container}>
        <SectionList
          sections={DATA}
          keyExtractor={(item, index) => item + index}
          renderItem={({ item }) => <Item title={item} />}
          renderSectionHeader={({ section: { title } }) => (
            <Text style={styles.header}>{title}</Text>
          )}
        />
      </SafeAreaView>
    );
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    marginTop: Constants.statusBarHeight,
    marginHorizontal: 16
  },
  item: {
    backgroundColor: "#f9c2ff",
    padding: 20,
    marginVertical: 8
  },
  header: {
    fontSize: 32,
    backgroundColor: "#fff"
  },
  title: {
    fontSize: 24
  }
});

export default App;

يعد هذا المكون غلافًا ملائمًا للمكوّن الأساسيّ VirtualizedList, لذا يرث خاصّيّاته (كذلك خاصّيّات ScrollView) مع مراعاة ما يلي:

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





لصارمة === بعد التحديثات، وإلا فلن تُحدّث الواجهة عند التّغيير، وهذا يتضمّن الخاصيّة data وحالة المكوّن الأب.

  • يصيّر المحتوى بشكلٍ غير متزامنٍ خارج نافذة الواجهة، وذلك لتقييد الذاكرة وتأمين تمريرٍ سلسٍ، مما يعني أنه يمكن التمرير أسرع من معدّل التعبئة (fill rate) مما يؤدي لظهور محتوىً فارغٍ للحظة، وهذا عبارة عن مقايضة (tradeoff) يمكن تعديلها لتناسب احتياجات كلّ تطبيق، ونعمل على تحسينه حاليًّأ.
  • تبحث القائمة -بشكلٍ افتراضيٍّ- عن الخاصيّة key لكل عنصر لتستخدمها كمفتاح React، غير أنه يمكن استخدام الخاصيّة keyExtractor المخصّصة بشكلٍ بديلٍ.

الخاصيات

موروثة من الخاصيّات ScrollView Props.

renderItem

المُصيّر الافتراضي لكل عنصرٍ في كلّ قسمٍ، ويمكن تجاوزها عل أساس كلّ قسم، ويجب أن تعيد عنصر React.

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

تمرَّر دالة التصيير ككائن له المفاتيح التالية:

  • 'item' (كائن): كائن العنصر والمحدد في المفتاح data الخاصّ بالقسم.
  • 'index' (عدد): دليل العنصر في القسم.
  • 'section' (كائن): كائن القسم الكامل كما هو محدّدٌ في sections.
  • 'separator' (كائن): كائن له المفاتيح التالية:
    • 'highlight' (دالة): () => void.
    • 'unhighlight' (دالة): () => void.
    • 'updateProps' (دالة): (select, newProps) => void.
      • 'select' (قيمة متعدّدة): قيمها المحتملة 'leading' أو 'trailing'.
      • 'newProps' (كائن).

sections

تمثّل البيانات الفعلية تصييرها، كما هو الحال مع الخاصيّة data في FlatList.

النوع مطلوب
مصفوفة من الأقسام (array of sections) نعم

extraData

خاصّيّةٌ تبيّن للقائمة حاجتها لإعادة التصيير (على اعتبار أنها تنفّذ PureComponent)، وتوضع فيها المعلومات التي تحتاجها الدوال (renderItem والترويسة والتذييل وغيرها) وهي غير موجودةٍ في الخاصية data.

النوع مطلوب
أي شيء (any) لا

initialNumToRender

تحدد عدد العناصر المصيّرة في الدفعة الأولى، والتي ستكون كافيةً لملء الشاشة لا أكثر، مع ملاحظة أن لن يتم استبدال عناصر الواجهة الأولى كجزء من عملية التصيير بالنوافذ (windowed rendering، يتم فيه استبدال عناصر نافذة الواجهة الحالية بعناصر النافذة التالية أثناء التمرير لتحسين الأداء)، وذلك للمحافظة على فاعلية التمرير للأعلى.

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

inverted

تقوم بعكس اتجاه التّمرير، باستخدام تحويل مقياس الرسم ذي القيمة 1-.

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

ItemSeparatorComponent

يُصيّر بين العناصر، ولكن لا في الأعلى أو الأسفل، ويزوَّد بشكلٍ افتراضيٍّ بالخاصيات highlighted و section و [leading/trailing][Item/Section]، كما تحتوي الدالة renderItem الخاصة بالواجهة View على separators.highlight و separators.unhighlight والمستخدمة لتحديث الخاصيّة highlighted، كما يمكن إضافة خاصيات مخصّصةٌ في separators. updateProps.

النوع مطلوب
عنصر، دالة، مكوّن (component, function, element) لا

keyExtractor

تُستخدم لاستخراج مفتاح فريد للعنصر المعطى وفق الدليل المحدّد، حيث يُستخدم هذا المفتاح للتّخزين المؤقّت (caching) ولتعقّب إعادة طلب العنصر، يتفحّص المستخرج الافتراضيّ item.key ثم يعود لاستخدام الدليل -كما يفعل React-، مع ملاحظة أن هذا المستخرج يحدّد مفاتيحًا لكلّ عنصر، ولا يزال كل قسمٍ عامٍّ بحاجةٍ لمفتاح خاصٍّ.

النوع مطلوب
سلسلة نصية ((item: Item, index: number) => string) نعم

ListEmptyComponent

تصيّر عندما تكون القائمة فارغةً، ويمكن أن يكون صنف مكوّن React أو دالة تصيير أو العنصر المُصيّر.

النوع مطلوب
عنصر، دالة، مكون (component, function, element) لا

ListFooterComponent

يصيّر في آخر القائمة، ويمكن أن يكون صنف مكوّن React أو دالة تصيير أو العنصر المُصيّر.

النوع مطلوب
عنصر، دالة، مكون (component, function, element) لا

ListHeaderComponent

يُصيّر في بداية القائمة، ويمكن أن يكون صنف مكوّن React أو دالة تصيير أو العنصر المُصيّر.

النوع مطلوب
عنصر، دالة، مكون (component, function, element) لا

onEndReached

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

النوع مطلوب
معلومات ((info: {distanceFromEnd: number}) => void) لا

onEndReachedThreshold

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

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

onRefresh

تُضيف تحكّمًا معياريًّا بالتحديث (standard RefreshControl) لوظيفة السحب للتحديث (Pull to Refresh)، كما يجب ضبط الخاصيّة refreshing بشكلٍ صحيحٍ، فمثلًا لإزاحة التحكم بالتحديث 100 نقطة (pt) من أعلى القائمة نضع القيمة progressViewOffset={100}.

النوع مطلوب
[() => void] لا

onViewableItemsChanged

تُستدعى عند تغيّر قابلية إظهار السطور، والمعرّفة بالخاصيّة viewabilityConfig.

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

يُمرر لهذه الدالة كائن له المفاتيح التالية:

  • 'viewableItems' (مصفوفة من ViewToken)
  • 'changed' (مصفوفة من ViewToken)

يُصدَّر النوع ViewToken عن طريق ViewabilityHelper.js:

الاسم النوع مطلوب
item أي نوع (any) نعم
key سلسلة نصية (string) نعم
index عدد (number) لا
isViewable قيمة منطقية (boolean) نعم
section أي نوع (any) لا

refreshing

تُضبط بالقيمة true لانتظار البيانات الجديدة من التحديث.

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

removeClippedSubview

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

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

renderSectionFooters

يُصيّر أسفل كلّ قسم.

النوع مطلوب
عنصر ((info: {section: SectionT}) => ?React.Element<any>) لا

renderSectionHeader

يُصيّر أعلى كلّ قسمٍ، كما تثبت أعلى عرض التمرير (ScrollView) بشكلٍ افتراضيٍ على منصّة iOS، يمكن مراجعة الخاصيّة stickySectionHeadersEnabled.

النوع مطلوب
عنصر ((info: {section: SectionT}) => ?React.Element<any>) لا

SectionSeparatorComponent

يُصيَّر أعلى وأسفل كلّ قسمٍ (يختلف عن المكوّن ItemSeparatorComponent الذي يُصيَّر بين العناصر فقط)، وهو مخصّصٌ لفصل الأقسام عن الترويسات الموجودة في الأعلى والأسفل، ولها نفس استجابة التمييز (highlight) كما هو الحال مع المكوّن ItemSeparatorComponent. كما يستقبل الخاصيات highlighted و [leading/trailing][Item/Section], وأية خاصيات مخصّصة من separators. updateProps.

النوع مطلوب
صنف React لا

stickySectionHeadersEnabled

تثبّت ترويسة القسم أعلى الشاشة حتى تأتي الترويسة التالية وتحلّ محلّها، ومفعّلة بشكلٍ افتراضيٍّ على منصّة iOS.

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

التوابع

scrollToLocation()

scrollToLocation(params);

يمرر إلى العنصر المحدّد بالخاصيتين sectionIndex و itemIndex (ضمن القسم)، والمتوضّع في المنطقة المرئية فمثلًا إذا كانت الخاصيّة viewPosition تساوي 0 فسيتوضّع العنصر في الأعلى (ويمكن أن تغطيه الترويسة الثابتة)، أما إذا كانت قيمتها 1 فسيتوضّع في الأسفل، وإذا كانت 0.5 فسيتوضّع في المنتصف.

ملاحظة: لا يمكن التمرير لموقع خارج نافذة التصيير دون تحديد الخاصيّة getItemLayout أو onScrollToIndexFailed.

الاسم النوع مطلوب الوصف
params كائن (object) نعم انظر في الأسفل

مفاتيح الكائن params:

  • 'animated' (قيمة منطقية): تحدد فيما إذا كانت القائمة ستتحرك أثناء التمرير، وقيمتها الافتراضية true.
  • 'itemIndex' (عدد): دليل العنصر الذي سيُمرر إليه داخل القسم. مطلوب.
  • 'sectionIndex' (عدد): دليل القسم الذي يحتوي على العنصر الذي سيُمرر إليه. مطلوب.
  • 'viewOffset' (عدد): عدد ثابت من البكسلات لإزاحة الموقع النهائي المطلوب، مثلًا بالموازنة مع الترويسات المثبتة.
  • 'viewPosition' (عدد): إذا كانت قيمتها 0 فسيتوضع العنصر المطلوب في الأعلى، وإذا كانت قيمتها 1 فسيتوضّع في الأسفل، وإن كانت 0.5 فسيتوضّع في المنتصف.

recordInteraction()

recordInteraction();

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

flashScrollIndicators()

flashScrollIndicators();

يُظهر مؤشرات التمرير بشكلٍ لحظيٍ، ويعمل على منصًة iOS فقط.

تعريفات النمط

Section

كائن معرّف للمعطيات التي ستُصير في قسمٍ معطىً.

النوع
أي نوع (any)

الخصائص

الاسم النوع الوصف
data مصفوفة (array) معطيات لتصيير العناصر في القسم، وهي مصفوفة من الكائنات مثل الخاصية FlatList's data prop
key سلسلة نصية (string) مفتاح اختياري لتعقب إعادة ترتيب الأقسام، ويستخدم دليل الأقسام بشكلٍ افتراضيٍ عند عدم استخدام هذا المفتاح
renderItem دالة (function) لتحديد مُصيرٍ اختياريٍّ لعناصر القسم بدل المُصير الافتراضي renderItem
ItemSeparatorComponent عنصر، دالة، مكون (component, function, element) لتحديد فاصل اختياري لعناصر القسم بدل الفاصل الافتراضي ItemSeparatorComponent
keyExtractor دالة (function) لتحديد مستخرج مفتاح اختياري للقسم بدل المستخرج الافتراضي keyExtractor

مصادر