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

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(رفع المحتوى)
ط
 
(مراجعتان متوسطتان بواسطة مستخدمين اثنين آخرين غير معروضتين)
سطر 13: سطر 13:
 
* تدعم تحميل التّمرير (Scroll loading).
 
* تدعم تحميل التّمرير (Scroll loading).
  
يمكن استخدام واجهة أبسط مثل [https://reactnative.dev/docs/flatlist <code>FlatList</code>] عند عدم الحاجة لدعم الأقسام.  
+
يمكن استخدام واجهة أبسط مثل <code>[[ReactNative/flatlist|FlatList]]</code> عند عدم الحاجة لدعم الأقسام.  
 
__toc__
 
__toc__
 
== مثال ==
 
== مثال ==
  
* مثال لمكوِّن الدالّة (Function Component)
+
* [https://snack.expo.dev/@hsoubwiki/sectionlist-example-function-component مثال لمكوِّن دالّة (Function Component)]
  
 
<syntaxhighlight lang="javascript">import React from "react";
 
<syntaxhighlight lang="javascript">import React from "react";
import {
+
import { StyleSheet, Text, View, SafeAreaView, SectionList, StatusBar } from "react-native";
  StyleSheet,
 
  Text,
 
  View,
 
  SafeAreaView,
 
  SectionList
 
} from "react-native";
 
import Constants from "expo-constants";
 
  
 
const DATA = [
 
const DATA = [
سطر 70: سطر 63:
 
   container: {
 
   container: {
 
     flex: 1,
 
     flex: 1,
     marginTop: Constants.statusBarHeight,
+
     paddingTop: StatusBar.currentHeight,
 
     marginHorizontal: 16
 
     marginHorizontal: 16
 
   },
 
   },
سطر 88: سطر 81:
  
 
export default App; </syntaxhighlight>
 
export default App; </syntaxhighlight>
* مثال لمكوِّن الصنف (Class Component)
+
* [https://snack.expo.dev/@hsoubwiki/sectionlist-example-class-component مثال لمكوِّن صنف (Class Component)]
  
 
<syntaxhighlight lang="javascript">import React, { Component } from "react";
 
<syntaxhighlight lang="javascript">import React, { Component } from "react";
import {
+
import { StyleSheet, Text, View, SafeAreaView, SectionList, StatusBar } from "react-native";
  StyleSheet,
 
  Text,
 
  View,
 
  SafeAreaView,
 
  SectionList
 
} from "react-native";
 
import Constants from "expo-constants";
 
  
 
const DATA = [
 
const DATA = [
سطر 119: سطر 105:
 
];
 
];
  
Item = ({ title }) => (
+
const Item = ({ title }) => (
 
   <View style={styles.item}>
 
   <View style={styles.item}>
 
     <Text style={styles.title}>{title}</Text>
 
     <Text style={styles.title}>{title}</Text>
سطر 145: سطر 131:
 
   container: {
 
   container: {
 
     flex: 1,
 
     flex: 1,
     marginTop: Constants.statusBarHeight,
+
     paddingTop: StatusBar.currentHeight,
 
     marginHorizontal: 16
 
     marginHorizontal: 16
 
   },
 
   },
سطر 163: سطر 149:
  
 
export default App; </syntaxhighlight>
 
export default App; </syntaxhighlight>
يعد هذا المكون غلافًا ملائمًا للمكوّن الأساسيّ [https://reactnative.dev/docs/virtualizedlist <code>VirtualizedList</code>], لذا يرث خاصّيّاته (كذلك خاصّيّات [https://wiki.hsoub.com/ReactNative/scrollview <code>ScrollView</code>]) مع مراعاة ما يلي:
+
يعد هذا المكون غلافًا ملائمًا للمكوّن الأساسيّ <code>[[ReactNative/virtualizedlist|VirtualizedList]]</code>, لذا يرث خاصّيّاته (كذلك خاصّيّات <code>[[ReactNative/scrollview|ScrollView]]</code>) مع مراعاة ما يلي:
 
 
* لا تُحفظ الحالة الداخلية عند تمرير المحتوى خارج نافذة التصيير، لذا يجب التأكد من حفظ البيانات ضمن عنصر البيانات أو في المخازن الخارجية مثل Flux أو Redux أو Relay.
 
* إن هذا المكوّن من النوع الصافي <code>PureComponent</code> أي أنّه لن يُعاد تصييره عندما تبقى قيم الخاصيات <code>Props</code> متساويةً سطحيًا (shallow-equal)، لذا يجب التأكد من أن كلّ ما تعتمد عليه الدّالة <code>renderItem</code> يمرّر لها كخاصّيّةٍ (مثل <code>extraData</code>) لا تحتوي على المساواة ا
 
 
 
 
 
  
 +
* لا تُحفظ الحالة الداخلية عند تمرير المحتوى خارج نافذة التصيير، لذا يجب التأكد من حفظ البيانات ضمن عنصر البيانات أو في المخازن الخارجية، مثل: Flux، أو Redux، أو Relay.
 +
* يُعَدّ هذا المكوّن من النوع الصافي <code>PureComponent</code> أي أنّه لن يُعاد تصييره عندما تبقى قيم الخاصيات <code>Props</code> متساويةً سطحيًا (shallow-equal)، لذا يجب التأكد من أن كلّ ما تعتمد عليه الدّالة <code>renderItem</code> يمرّر لها كخاصّيّةٍ (مثل <code>extraData</code>)، بحيث لا تحتوي على المساواة الصارمة <code>===</code> بعد التحديثات، وإلا فلن تُحدّث الواجهة عند التّغيير، وهذا يتضمّن الخاصيّة <code>data</code> وحالة المكوّن الأب.
  
 
+
* يصيّر المحتوى بصورة غير متزامنة خارج نافذة الواجهة وذلك لتقييد الذاكرة وتأمين تمريرٍ سلسٍ، مما يعني أنه يمكن التمرير أسرع من معدّل التعبئة (fill rate) مما يؤدي لظهور محتوىً فارغٍ للحظة، وهذا عبارة عن مقايضة (tradeoff) يمكن تعديلها لتناسب احتياجات كلّ تطبيق، ونعمل على تحسينه حاليًّأ.
 
+
* تبحث القائمة -افتراضيًّا- عن الخاصيّة <code>key</code> لكل عنصر لتستخدمها مثل مفتاح [[React]]، غير أنه يمكن استخدام الخاصيّة <code>keyExtractor</code> المخصّصة على أساس بديل.
 
 
 
 
 
 
لصارمة <code>===</code> بعد التحديثات، وإلا فلن تُحدّث الواجهة عند التّغيير، وهذا يتضمّن الخاصيّة <code>data</code> وحالة المكوّن الأب.
 
 
 
* يصيّر المحتوى بشكلٍ غير متزامنٍ خارج نافذة الواجهة، وذلك لتقييد الذاكرة وتأمين تمريرٍ سلسٍ، مما يعني أنه يمكن التمرير أسرع من معدّل التعبئة (fill rate) مما يؤدي لظهور محتوىً فارغٍ للحظة، وهذا عبارة عن مقايضة (tradeoff) يمكن تعديلها لتناسب احتياجات كلّ تطبيق، ونعمل على تحسينه حاليًّأ.
 
* تبحث القائمة -بشكلٍ افتراضيٍّ- عن الخاصيّة <code>key</code> لكل عنصر لتستخدمها كمفتاح React، غير أنه يمكن استخدام الخاصيّة <code>keyExtractor</code> المخصّصة بشكلٍ بديلٍ.
 
  
 
== الخاصيات  ==
 
== الخاصيات  ==
  
موروثة من الخاصيّات [https://wiki.hsoub.com/ReactNative/scrollview#props <code>ScrollView Props</code>].
+
موروثة من خاصيّات <code>[[ReactNative/scrollview|ScrollView]]</code> .
  
 
=== <code>renderItem</code> ===
 
=== <code>renderItem</code> ===
  
المُصيّر الافتراضي لكل عنصرٍ في كلّ قسمٍ، ويمكن تجاوزها عل أساس كلّ قسم، ويجب أن تعيد عنصر React.
+
المُصيّر الافتراضي لكل عنصرٍ في كلّ قسمٍ، ويمكن تجاوزها عل أساس كلّ قسم، ويجب أن تعيد عنصر <code>React</code>.
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 199: سطر 175:
 
تمرَّر دالة التصيير ككائن له المفاتيح التالية:
 
تمرَّر دالة التصيير ككائن له المفاتيح التالية:
  
* 'item' (كائن): كائن العنصر والمحدد في المفتاح <code>data</code> الخاصّ بالقسم.  
+
* <code>'item'</code> (كائن): كائن العنصر والمحدد في المفتاح <code>data</code> الخاصّ بالقسم.
* 'index' (عدد): دليل العنصر في القسم.  
+
* <code>'index'</code> (عدد): دليل العنصر في القسم.
* 'section' (كائن): كائن القسم الكامل كما هو محدّدٌ في <code>sections</code>.  
+
* <code>'section'</code> (كائن): كائن القسم الكامل كما هو محدّدٌ في <code>sections</code>.
* 'separator' (كائن): كائن له المفاتيح التالية:
+
* <code>'separator'</code> (كائن): كائن له المفاتيح التالية:
** 'highlight' (دالة): <code>() =&gt; void</code>.  
+
**<code>'highlight'</code> (دالة): <code>() =&gt; void</code>.
** 'unhighlight' (دالة): <code>() =&gt; void</code>.  
+
** <code>'unhighlight'</code> (دالة): <code>() =&gt; void</code>.
** 'updateProps' (دالة): <code>(select, newProps) =&gt; void</code>.  
+
** <code>'updateProps'</code> (دالة): <code>(select, newProps) =&gt; void</code>.  
*** 'select' (قيمة متعدّدة): قيمها المحتملة 'leading' أو 'trailing'.
+
***<code>'select'</code> (قيمة متعدّدة): قيمها المحتملة <code>'leading'</code> أو <code>'trailing'</code>.
*** 'newProps' (كائن).
+
*** <code>'newProps'</code> (كائن).
  
 
=== <code>sections</code> ===
 
=== <code>sections</code> ===
  
تمثّل البيانات الفعلية تصييرها، كما هو الحال مع الخاصيّة <code>data</code> في [https://reactnative.dev/docs/flatlist <code>FlatList</code>].
+
تمثّل البيانات الفعلية تصييرها، كما هو الحال مع الخاصيّة <code>data</code> في <code>[[ReactNative/flatlist|FlatList]]</code>.
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 217: سطر 193:
 
! مطلوب
 
! مطلوب
 
|-
 
|-
| مصفوفة من الأقسام (array of sections)
+
| مصفوفة من النوع Section (انظر في الأسفل)
 
| نعم
 
| نعم
 
|}
 
|}
سطر 235: سطر 211:
 
=== <code>initialNumToRender</code> ===
 
=== <code>initialNumToRender</code> ===
  
تحدد عدد العناصر المصيّرة في الدفعة الأولى، والتي ستكون كافيةً لملء الشاشة لا أكثر، مع ملاحظة أن لن يتم استبدال عناصر الواجهة الأولى كجزء من عملية التصيير بالنوافذ (windowed rendering، يتم فيه استبدال عناصر نافذة الواجهة الحالية بعناصر النافذة التالية أثناء التمرير لتحسين الأداء)، وذلك للمحافظة على فاعلية التمرير للأعلى.  
+
تحدد عدد العناصر المصيّرة في الدفعة الأولى، والتي ستكون كافيةً لملء الشاشة لا أكثر، مع ملاحظة أن لن يتم استبدال عناصر الواجهة الأولى كجزء من عملية التصيير بالنوافذ (windowed rendering)، تُستبدل فيه عناصر نافذة الواجهة الحالية بعناصر النافذة التالية أثناء التمرير لتحسين الأداء)، وذلك للمحافظة على فاعلية التمرير للأعلى.
 +
 
 +
القيمة الافتراضية: 10.  
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 247: سطر 225:
 
=== <code>inverted</code> ===
 
=== <code>inverted</code> ===
  
تقوم بعكس اتجاه التّمرير، باستخدام تحويل مقياس الرسم ذي القيمة 1-.
+
تقوم بعكس اتجاه التّمرير، باستخدام تحويل مقياس الرسم ذي القيمة <code>1-</code>.
 +
 
 +
القيمة الافتراضية <code>false</code>.
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 253: سطر 233:
 
! مطلوب
 
! مطلوب
 
|-
 
|-
| قيمة منطقية (boolean)
+
| (boolean)
 
| لا
 
| لا
 
|}
 
|}
سطر 259: سطر 239:
 
=== <code>ItemSeparatorComponent</code> ===
 
=== <code>ItemSeparatorComponent</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>.
+
يُصيّر بين العناصر ولكن لا في الأعلى أو الأسفل، ويزوَّد افتراضيًّا بالخاصيات التالية:
 +
 
 +
* <code>highlighted</code>
 +
* <code>section</code>
 +
* <code>[leading/trailing][Item/Section]</code>،
 +
 
 +
كما تحتوي الدالة <code>renderItem</code> الخاصة بالواجهة <code>[[ReactNative/view|View]]</code> على <code>separators.highlight</code>، و <code>separators.unhighlight</code> والمستخدمة لتحديث الخاصيّة <code>highlighted</code>، كما يمكن إضافة خاصيات مخصّصةٌ في <code>separators.updateProps</code>.
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 265: سطر 251:
 
! مطلوب
 
! مطلوب
 
|-
 
|-
| عنصر، دالة، مكوّن (component, function, element)
+
| (مكون component, عنصر  element)
 
| لا
 
| لا
 
|}
 
|}
سطر 277: سطر 263:
 
! مطلوب
 
! مطلوب
 
|-
 
|-
| سلسلة نصية ((item: Item, index: number) =&gt; string)
+
| item: Item, index: number) =&gt; string)
 
| نعم
 
| نعم
 
|}
 
|}
سطر 283: سطر 269:
 
=== <code>ListEmptyComponent</code> ===
 
=== <code>ListEmptyComponent</code> ===
  
تصيّر عندما تكون القائمة فارغةً، ويمكن أن يكون صنف مكوّن React أو دالة تصيير أو العنصر المُصيّر.
+
تصيّر عندما تكون القائمة فارغةً، ويمكن أن يكون مكوّن [[React]] (مثل <code>SomeComponent</code>) أو عنصر React (مثل <code><SomeComponent /‎></code>).
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 289: سطر 275:
 
! مطلوب
 
! مطلوب
 
|-
 
|-
| عنصر، دالة، مكون (component, function, element)
+
| (مكون component, عنصر  element)
 
| لا
 
| لا
 
|}
 
|}
سطر 295: سطر 281:
 
=== <code>ListFooterComponent</code> ===
 
=== <code>ListFooterComponent</code> ===
  
يصيّر في آخر القائمة، ويمكن أن يكون صنف مكوّن React أو دالة تصيير أو العنصر المُصيّر.
+
يصيّر في آخر القائمة، ويمكن أن يكون مكوّن [[React]] (مثل <code>SomeComponent</code>) أو عنصر React (مثل <code><SomeComponent /‎></code>).
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 301: سطر 287:
 
! مطلوب
 
! مطلوب
 
|-
 
|-
| عنصر، دالة، مكون (component, function, element)
+
| (مكون component, عنصر  element)
 
| لا
 
| لا
 
|}
 
|}
سطر 307: سطر 293:
 
=== <code>ListHeaderComponent</code> ===
 
=== <code>ListHeaderComponent</code> ===
  
يُصيّر في بداية القائمة، ويمكن أن يكون صنف مكوّن React أو دالة تصيير أو العنصر المُصيّر.
+
يُصيّر في بداية القائمة، ويمكن أن يكون مكوّن [[React]] (مثل <code>SomeComponent</code>) أو عنصر React (مثل <code><SomeComponent /‎></code>).
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 313: سطر 299:
 
! مطلوب
 
! مطلوب
 
|-
 
|-
| عنصر، دالة، مكون (component, function, element)
+
| (مكون component, عنصر  element)
 
| لا
 
| لا
 
|}
 
|}
سطر 325: سطر 311:
 
! مطلوب
 
! مطلوب
 
|-
 
|-
| معلومات ((info: {distanceFromEnd: number}) =&gt; void)
+
| ‎<code>(info: {distanceFromEnd: number}) => void</code>
 
| لا
 
| لا
 
|}
 
|}
سطر 331: سطر 317:
 
=== <code>onEndReachedThreshold</code> ===
 
=== <code>onEndReachedThreshold</code> ===
  
تحدّد كم يجب أن يكون بعد الحافة السفلى للقائمة (بوحدات طول القائمة المرئيّ) عن نهاية المحتوى والتي سيطلق عندها رد النداء <code>onEndReached</code>، لذا ستُطلق القيمة 0.5 الاستجابة <code>onEndReached</code> عندما تكون نهاية المحتوى في حدود منتصف طول القائمة المرئيّ.  
+
تحدّد كم يجب أن يكون بعد الحافة السفلى للقائمة (بوحدات طول القائمة المرئيّ) عن نهاية المحتوى والتي سيطلق عندها رد النداء <code>onEndReached</code>، لذا ستُطلق القيمة <code>0.5</code> الاستجابة <code>onEndReached</code> عندما تكون نهاية المحتوى في حدود منتصف طول القائمة المرئيّ.
 +
 
 +
القيمة الافتراضية 2.  
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 343: سطر 331:
 
=== <code>onRefresh</code> ===
 
=== <code>onRefresh</code> ===
  
تُضيف تحكّمًا معياريًّا بالتحديث (standard RefreshControl) لوظيفة السحب للتحديث (Pull to Refresh)، كما يجب ضبط الخاصيّة <code>refreshing</code> بشكلٍ صحيحٍ، فمثلًا لإزاحة التحكم بالتحديث 100 نقطة (pt) من أعلى القائمة نضع القيمة <code>progressViewOffset={100}</code>.
+
تُضيف تحكّمًا معياريًّا بالتحديث (standard RefreshControl) لوظيفة السحب للتحديث (Pull to Refresh)، كما يجب ضبط الخاصيّة <code>refreshing</code> بطريقة صحيحة، فمثلًا لإزاحة التحكم بالتحديث 100 نقطة (pt) من أعلى القائمة، نضع القيمة <code>{progressViewOffset={100</code>.
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 349: سطر 337:
 
! مطلوب
 
! مطلوب
 
|-
 
|-
| [() =&gt; void]
+
| دالة
 
| لا
 
| لا
 
|}
 
|}
سطر 361: سطر 349:
 
! مطلوب
 
! مطلوب
 
|-
 
|-
| دالة (function)
+
| (callback: { changed: array of ViewTokens, viewableItems: array of ViewTokens }) => void
| لا
 
|}
 
 
 
يُمرر لهذه الدالة كائن له المفاتيح التالية:
 
 
 
* 'viewableItems' (مصفوفة من <code>ViewToken</code>)
 
* 'changed' (مصفوفة من <code>ViewToken</code>)
 
 
 
يُصدَّر النوع <code>ViewToken</code> عن طريق <code>ViewabilityHelper.js</code>:
 
 
 
{| class="wikitable"
 
! الاسم
 
! النوع
 
! مطلوب
 
|-
 
| item
 
| أي نوع (any)
 
| نعم
 
|-
 
| key
 
| سلسلة نصية (string)
 
| نعم
 
|-
 
| index
 
| عدد (number)
 
| لا
 
|-
 
| isViewable
 
| قيمة منطقية (boolean)
 
| نعم
 
|-
 
| section
 
| أي نوع (any)
 
 
| لا
 
| لا
 
|}
 
|}
سطر 406: سطر 361:
 
! مطلوب
 
! مطلوب
 
|-
 
|-
| قيمة منطقية (bool)
+
| (bool)
 
| لا
 
| لا
 
|}
 
|}
  
 
=== <code>removeClippedSubview</code> ===
 
=== <code>removeClippedSubview</code> ===
 +
<blockquote>'''تنبيه''': قد تواجهة خطأ (محتوى مفقود) في بعض الحالات، لذا لا ننصح باستعمالها إلا إن أحببت المخاطرة على مسؤوليتك.</blockquote>تُستخدم لتحسين أداء التمرير في القوائم الطويلة، مع ملاحظة إمكانية ظهور بعض العيوب أحيانًا (مثل المحتوى مفقود) لذا استخدمها على مسؤوليّتك الشخصيّة.
  
تُستخدم لتحسين أداء التمرير في القوائم الطويلة، مع ملاحظة إمكانية ظهور بعض العيوب أحيانًا (كالمحتوى مفقود) لذا استخدمها على مسؤوليّتك الشخصيّة.
+
القيمة الافتراضية <code>false</code>.
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 418: سطر 374:
 
! مطلوب
 
! مطلوب
 
|-
 
|-
| قيمة منطقية (bool)
+
| (bool)
 
| لا
 
| لا
 
|}
 
|}
  
=== <code>renderSectionFooters</code> ===
+
=== <code>renderSectionFooter</code> ===
  
 
يُصيّر أسفل كلّ قسم.
 
يُصيّر أسفل كلّ قسم.
سطر 430: سطر 386:
 
! مطلوب
 
! مطلوب
 
|-
 
|-
| عنصر ((info: {section: SectionT}) =&gt; ?React.Element<any>)
+
| (info: { section: Section }) => element, null
 
| لا
 
| لا
 
|}
 
|}
سطر 436: سطر 392:
 
=== <code>renderSectionHeader</code> ===
 
=== <code>renderSectionHeader</code> ===
  
يُصيّر أعلى كلّ قسمٍ، كما تثبت أعلى عرض التمرير (<code>ScrollView</code>) بشكلٍ افتراضيٍ على منصّة iOS، يمكن مراجعة الخاصيّة <code>stickySectionHeadersEnabled</code>.
+
يُصيّر أعلى كلّ قسمٍ، كما تثبت أعلى واجهة التمرير (<code>ScrollView</code>) افتراضيًا على منصّة iOS، يمكن مراجعة الخاصيّة <code>stickySectionHeadersEnabled</code>.
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 442: سطر 398:
 
! مطلوب
 
! مطلوب
 
|-
 
|-
| عنصر ((info: {section: SectionT}) =&gt; ?React.Element<any>)
+
| (info: { section: Section }) => element, null
 
| لا
 
| لا
 
|}
 
|}
سطر 448: سطر 404:
 
=== <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"
سطر 454: سطر 410:
 
! مطلوب
 
! مطلوب
 
|-
 
|-
| صنف React
+
| (مكون component, عنصر  element)
 
| لا
 
| لا
 
|}
 
|}
سطر 460: سطر 416:
 
=== <code>stickySectionHeadersEnabled</code> ===
 
=== <code>stickySectionHeadersEnabled</code> ===
  
تثبّت ترويسة القسم أعلى الشاشة حتى تأتي الترويسة التالية وتحلّ محلّها، ومفعّلة بشكلٍ افتراضيٍّ على منصّة iOS.
+
تثبّت ترويسة القسم أعلى الشاشة حتى تأتي الترويسة التالية وتحلّ محلّها، ومفعّلة افتراضيًّا على منصّة iOS أي قيمتها <code>true</code> بينما قيمتها الافتراضية <code>false</code> على منصة Android.
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 466: سطر 422:
 
! مطلوب
 
! مطلوب
 
|-
 
|-
| قيمة منطقية (bool)
+
| (bool)
 
| لا
 
| لا
 
|}
 
|}
سطر 472: سطر 428:
 
== التوابع  ==
 
== التوابع  ==
  
=== <code>scrollToLocation()</code> ===
+
=== <code>‎scrollToLocation()</code> ===
  
 
<syntaxhighlight lang="javascript">scrollToLocation(params);</syntaxhighlight>
 
<syntaxhighlight lang="javascript">scrollToLocation(params);</syntaxhighlight>
يمرر إلى العنصر المحدّد بالخاصيتين <code>sectionIndex</code> و <code>itemIndex</code> (ضمن القسم)، والمتوضّع في المنطقة المرئية فمثلًا إذا كانت الخاصيّة <code>viewPosition</code> تساوي 0 فسيتوضّع العنصر في الأعلى (ويمكن أن تغطيه الترويسة الثابتة)، أما إذا كانت قيمتها 1 فسيتوضّع في الأسفل، وإذا كانت 0.5 فسيتوضّع في المنتصف.  
+
يمرر إلى العنصر المحدّد بالخاصيتين <code>sectionIndex</code> و<code>itemIndex</code> (ضمن القسم)، والمتوضّع في المنطقة المرئية فمثلًا إذا كانت الخاصيّة <code>viewPosition</code> تساوي فسيتوضّع العنصر في الأعلى (ويمكن أن تغطيه الترويسة الثابتة)؛ أما إذا كانت قيمتها <code>1</code> فسيتوضّع في الأسفل، وإذا كانت <code>0.5</code> فسيتوضّع في المنتصف.  
  
 
'''ملاحظة:''' لا يمكن التمرير لموقع خارج نافذة التصيير دون تحديد الخاصيّة <code>getItemLayout</code> أو <code>onScrollToIndexFailed</code>.
 
'''ملاحظة:''' لا يمكن التمرير لموقع خارج نافذة التصيير دون تحديد الخاصيّة <code>getItemLayout</code> أو <code>onScrollToIndexFailed</code>.
سطر 493: سطر 449:
 
مفاتيح الكائن <code>params</code>:
 
مفاتيح الكائن <code>params</code>:
  
* 'animated' (قيمة منطقية): تحدد فيما إذا كانت القائمة ستتحرك أثناء التمرير، وقيمتها الافتراضية <code>true</code>.  
+
* <code>'animated'</code> (قيمة منطقية): تحدد فيما إذا كانت القائمة ستتحرك أثناء التمرير، وقيمتها الافتراضية <code>true</code>.
* 'itemIndex' (عدد): دليل العنصر الذي سيُمرر إليه داخل القسم. مطلوب.  
+
* <code>'itemIndex'</code> (عدد): دليل العنصر الذي سيُمرر إليه داخل القسم المطلوب.
* 'sectionIndex' (عدد): دليل القسم الذي يحتوي على العنصر الذي سيُمرر إليه. مطلوب.
+
* <code>'sectionIndex'</code> (عدد): دليل القسم الذي يحتوي على العنصر الذي سيُمرر إليه المطلوب.
* 'viewOffset' (عدد): عدد ثابت من البكسلات لإزاحة الموقع النهائي المطلوب، مثلًا بالموازنة مع الترويسات المثبتة.
+
* <code>'viewOffset'</code> (عدد): عدد ثابت من البكسلات لإزاحة الموقع النهائي المطلوب، مثلًا بالموازنة مع الترويسات المثبتة.
* 'viewPosition' (عدد): إذا كانت قيمتها <code>0</code> فسيتوضع العنصر المطلوب في الأعلى، وإذا كانت قيمتها <code>1</code> فسيتوضّع في الأسفل، وإن كانت <code>0.5</code> فسيتوضّع في المنتصف.  
+
* <code>'viewPosition'</code> (عدد): إذا كانت قيمتها <code>0</code> فسيتوضع العنصر المطلوب في الأعلى، وإذا كانت قيمتها <code>1</code> فسيتوضّع في الأسفل، وإن كانت <code>0.5</code> فسيتوضّع في المنتصف.
  
=== <code>recordInteraction()</code> ===
+
=== <code>‎recordInteraction()</code> ===
  
 
<syntaxhighlight lang="javascript">recordInteraction(); </syntaxhighlight>
 
<syntaxhighlight lang="javascript">recordInteraction(); </syntaxhighlight>
يخبر القائمة بحدوث تفاعل لتقوم بإطلاق حسابات قابلية الإظهار، مثلًا إذا كانت قيمة <code>waitForInteractions</code> مساويةً true ولم يقم المستخدم بالتمرير، يستدعى هذا التابع عادة عند النقر على العنصر أو عند التنقّل.
+
يخبر القائمة بحدوث تفاعل لتقوم بإطلاق حسابات قابلية الإظهار، مثلًا إذا كانت قيمة <code>waitForInteractions</code> مساويةً <code>true</code> ولم يقم المستخدم بالتمرير، يستدعى هذا التابع عادة عند النقر على العنصر أو عند التنقّل.
  
=== <code>flashScrollIndicators()</code> ===
+
=== <code>‎flashScrollIndicators()</code> ===
  
 
<syntaxhighlight lang="javascript">flashScrollIndicators();</syntaxhighlight>
 
<syntaxhighlight lang="javascript">flashScrollIndicators();</syntaxhighlight>
يُظهر مؤشرات التمرير بشكلٍ لحظيٍ، ويعمل على منصًة iOS فقط.
+
يُظهر مؤشرات التمرير لحظيًّا، ويعمل على منصًة iOS فقط.
  
== تعريفات النمط  ==
+
== تعريفات النوع ==
  
 
=== <code>Section</code> ===
 
=== <code>Section</code> ===
سطر 520: سطر 476:
 
| أي نوع (any)
 
| أي نوع (any)
 
|}
 
|}
 
+
الخاصيات:
== الخصائص  ==
 
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
! الاسم
 
! الاسم
 +
!مطلوب
 
! النوع
 
! النوع
 
! الوصف
 
! الوصف
 
|-
 
|-
| <code>data</code>
+
|<code>data</code>
 +
|نعم
 
| مصفوفة (array)
 
| مصفوفة (array)
| معطيات لتصيير العناصر في القسم، وهي مصفوفة من الكائنات مثل الخاصية [https://reactnative.dev/docs/flatlist#data <code>FlatList's data prop</code>]
+
| معطيات لتصيير العناصر في القسم، وهي مصفوفة من الكائنات مثل الخاصية <code>[[ReactNative/flatlist#data|FlatList's data]]</code>
 
|-
 
|-
| <code>key</code>
+
|<code>key</code>
 +
|لا
 
| سلسلة نصية (string)
 
| سلسلة نصية (string)
 
| مفتاح اختياري لتعقب إعادة ترتيب الأقسام، ويستخدم دليل الأقسام بشكلٍ افتراضيٍ عند عدم استخدام هذا المفتاح
 
| مفتاح اختياري لتعقب إعادة ترتيب الأقسام، ويستخدم دليل الأقسام بشكلٍ افتراضيٍ عند عدم استخدام هذا المفتاح
 
|-
 
|-
| <code>renderItem</code>
+
|<code>renderItem</code>
 +
|لا
 
| دالة (function)
 
| دالة (function)
 
| لتحديد مُصيرٍ اختياريٍّ لعناصر القسم بدل المُصير الافتراضي <code>renderItem</code>
 
| لتحديد مُصيرٍ اختياريٍّ لعناصر القسم بدل المُصير الافتراضي <code>renderItem</code>
 
|-
 
|-
| <code>ItemSeparatorComponent</code>
+
|<code>ItemSeparatorComponent</code>
| عنصر، دالة، مكون (component, function, element)
+
|لا
 +
| عنصر، مكون (component, element)
 
| لتحديد فاصل اختياري لعناصر القسم بدل الفاصل الافتراضي <code>ItemSeparatorComponent</code>
 
| لتحديد فاصل اختياري لعناصر القسم بدل الفاصل الافتراضي <code>ItemSeparatorComponent</code>
 
|-
 
|-
| <code>keyExtractor</code>
+
|<code>keyExtractor</code>
 +
|لا
 
| دالة (function)
 
| دالة (function)
 
| لتحديد مستخرج مفتاح اختياري للقسم بدل المستخرج الافتراضي <code>keyExtractor</code>
 
| لتحديد مستخرج مفتاح اختياري للقسم بدل المستخرج الافتراضي <code>keyExtractor</code>
سطر 553: سطر 513:
 
* [https://facebook.github.io/react-native/docs/sectionlist صفحة SectionList في توثيق React Native الرسميّ]
 
* [https://facebook.github.io/react-native/docs/sectionlist صفحة SectionList في توثيق React Native الرسميّ]
 
[[تصنيف:ReactNative]]
 
[[تصنيف:ReactNative]]
 +
[[تصنيف:React Native Component]]

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

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

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

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

مثال

import React from "react";
import { StyleSheet, Text, View, SafeAreaView, SectionList, StatusBar } from "react-native";

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,
    paddingTop: StatusBar.currentHeight,
    marginHorizontal: 16
  },
  item: {
    backgroundColor: "#f9c2ff",
    padding: 20,
    marginVertical: 8
  },
  header: {
    fontSize: 32,
    backgroundColor: "#fff"
  },
  title: {
    fontSize: 24
  }
});

export default App;
import React, { Component } from "react";
import { StyleSheet, Text, View, SafeAreaView, SectionList, StatusBar } from "react-native";

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>
);

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,
    paddingTop: StatusBar.currentHeight,
    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 .

renderItem

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

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

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

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

sections

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

النوع مطلوب
مصفوفة من النوع Section (انظر في الأسفل) نعم

extraData

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

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

initialNumToRender

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

القيمة الافتراضية: 10.

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

inverted

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

القيمة الافتراضية false.

النوع مطلوب
(boolean) لا

ItemSeparatorComponent

يُصيّر بين العناصر ولكن لا في الأعلى أو الأسفل، ويزوَّد افتراضيًّا بالخاصيات التالية:

  • highlighted
  • section
  • [leading/trailing][Item/Section]،

كما تحتوي الدالة renderItem الخاصة بالواجهة View على separators.highlight، و separators.unhighlight والمستخدمة لتحديث الخاصيّة highlighted، كما يمكن إضافة خاصيات مخصّصةٌ في separators.updateProps.

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

keyExtractor

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

النوع مطلوب
item: Item, index: number) => string) نعم

ListEmptyComponent

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

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

ListFooterComponent

يصيّر في آخر القائمة، ويمكن أن يكون مكوّن React (مثل SomeComponent) أو عنصر React (مثل <SomeComponent /‎>).

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

ListHeaderComponent

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

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

onEndReached

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

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

onEndReachedThreshold

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

القيمة الافتراضية 2.

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

onRefresh

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

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

onViewableItemsChanged

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

النوع مطلوب
‎(callback: { changed: array of ViewTokens, viewableItems: array of ViewTokens }) => void لا

refreshing

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

النوع مطلوب
(bool) لا

removeClippedSubview

تنبيه: قد تواجهة خطأ (محتوى مفقود) في بعض الحالات، لذا لا ننصح باستعمالها إلا إن أحببت المخاطرة على مسؤوليتك.

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

القيمة الافتراضية false.

النوع مطلوب
(bool) لا

renderSectionFooter

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

النوع مطلوب
‎(info: { section: Section }) => element, null لا

renderSectionHeader

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

النوع مطلوب
‎(info: { section: Section }) => element, null لا

SectionSeparatorComponent

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

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

stickySectionHeadersEnabled

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

النوع مطلوب
(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
key لا سلسلة نصية (string) مفتاح اختياري لتعقب إعادة ترتيب الأقسام، ويستخدم دليل الأقسام بشكلٍ افتراضيٍ عند عدم استخدام هذا المفتاح
renderItem لا دالة (function) لتحديد مُصيرٍ اختياريٍّ لعناصر القسم بدل المُصير الافتراضي renderItem
ItemSeparatorComponent لا عنصر، مكون (component, element) لتحديد فاصل اختياري لعناصر القسم بدل الفاصل الافتراضي ItemSeparatorComponent
keyExtractor لا دالة (function) لتحديد مستخرج مفتاح اختياري للقسم بدل المستخرج الافتراضي keyExtractor

مصادر