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

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
ط
 
(10 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
 
<noinclude>{{DISPLAYTITLE: المكون FlatList في React Native}}</noinclude>
 
<noinclude>{{DISPLAYTITLE: المكون FlatList في React Native}}</noinclude>
واجهة أداء لتصيير قوائم مسطحة بسيطة تدعم الميزات الأكثر فائدة:
+
واجهة عالية الأداء لتصيير قوائم مسطحة بسيطة تدعم الميزات الأكثر فائدة:
  
 
* عابر منصات (أو متعدّد المنصات: cross-platform) بالكامل.
 
* عابر منصات (أو متعدّد المنصات: cross-platform) بالكامل.
سطر 14: سطر 14:
  
 
إذا احتجت لاستعمال الأقسام، فاستخدم <code>[[ReactNative/sectionlist|<SectionList>]]</code>.
 
إذا احتجت لاستعمال الأقسام، فاستخدم <code>[[ReactNative/sectionlist|<SectionList>]]</code>.
 +
__TOC__
 +
إليك مقال بسيط ([https://snack.expo.dev/@hsoubwiki/flatlist-simple تجربة حية]):
 +
<syntaxhighlight lang="javascript">
 +
import React from 'react';
 +
import { SafeAreaView, View, FlatList, StyleSheet, Text, StatusBar } from 'react-native';
 +
 +
const DATA = [
 +
  {
 +
    id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba',
 +
    title: 'First Item',
 +
  },
 +
  {
 +
    id: '3ac68afc-c605-48d3-a4f8-fbd91aa97f63',
 +
    title: 'Second Item',
 +
  },
 +
  {
 +
    id: '58694a0f-3da1-471f-bd96-145571e29d72',
 +
    title: 'Third Item',
 +
  },
 +
];
 +
 +
const Item = ({ title }) => (
 +
  <View style={styles.item}>
 +
    <Text style={styles.title}>{title}</Text>
 +
  </View>
 +
);
 +
 +
const App = () => {
 +
  const renderItem = ({ item }) => (
 +
    <Item title={item.title} />
 +
  );
  
مثال بسيط:
+
  return (
<syntaxhighlight lang="javascript">
+
    <SafeAreaView style={styles.container}>
<FlatList
+
      <FlatList
  data={[{key: 'a'}, {key: 'b'}]}
+
        data={DATA}
  renderItem={({item}) => <Text>{item.key}</Text>}
+
        renderItem={renderItem}
/>
+
        keyExtractor={item => item.id}
 +
      />
 +
    </SafeAreaView>
 +
  );
 +
}
 +
 
 +
const styles = StyleSheet.create({
 +
  container: {
 +
    flex: 1,
 +
    marginTop: StatusBar.currentHeight || 0,
 +
  },
 +
  item: {
 +
    backgroundColor: '#f9c2ff',
 +
    padding: 20,
 +
    marginVertical: 8,
 +
    marginHorizontal: 16,
 +
  },
 +
  title: {
 +
    fontSize: 32,
 +
  },
 +
});
 +
 
 +
export default App;
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
لتصيير أعمدة متعددة، استخدم خاصية <code>numColumns</code> يمكن أن يؤدي استخدام هذا الأسلوب بدلاً من تخطيط <code>flexWrap</code> إلى منع التعارضات مع منطق ارتفاع العنصر (item height logic).
 
لتصيير أعمدة متعددة، استخدم خاصية <code>numColumns</code> يمكن أن يؤدي استخدام هذا الأسلوب بدلاً من تخطيط <code>flexWrap</code> إلى منع التعارضات مع منطق ارتفاع العنصر (item height logic).
  
مثال أعقد ومتعدد التحديد (multi-select) يوضح استخدام <code>PureComponent</code> لتحسين الأداء وتجنب الأخطاء.
+
إليك مثال أعقد:
  
* من خلال ربط معالج <code>onPressItem</code>، ستبقى الخاصيات متساويّةً (‎‎<code>===</code>‎‎) وستمنع <code>PureComponent</code> إعادة تصييرات مسرفة ما لم تتغير خاصيات <code>id</code> أو <code>selected</code> أو<code>title</code>، ولو لم تملك المكونات المصيّرة في <code>MyListItem</code> مثل هذه التحسينات.
+
* بتمرير  ‎‎<code>extraData={selectedId}</code>‎‎ إلى <code>FlatList</code>، نتأكد من إعادة تصيير <code>FlatList</code> نفسه عندما يحدث تغير في الحالة‎‎. إذا لم تُعيَّن هذه الخاصية فلن يعلم مكوّن <code>FlatList</code> أنه يحتاج إلى إعادة تصيير أي عناصر لأنه أيضًا مكوِّنٌ من النوع <code>PureComponent</code> ولن تعرض مقارنة الخاصيات أي تغييرات.
  
* بتمرير  ‎‎<code>extraData={this.state}</code>‎‎ إلى FlatList، نتأكد من إعادة تصيير FlatList نفسه عندما تتغير قيمة ‎‎<code>state.selected</code>‎‎. إذا لم تُعيَّن هذه الخاصية فلن يعلم مكوّن FlatList أنه يحتاج إلى إعادة تصيير أي عناصر لأنه أيضًا مكوِّنٌ من النوع <code>PureComponent</code> ولن تعرض مقارنة الخاصيات أي تغييرات.
+
* يخبر <code>keyExtractor</code> القائمة باستخدام المعرفات (‎‎<code>id</code>‎‎) لمفاتيح react بدلاً من خاصية المفتاح <code>key</code> الافتراضية.
 +
شيفرة المثال ([https://snack.expo.dev/@hsoubwiki/flatlist-selectable تجربة حية]):<syntaxhighlight lang="javascript">
 +
import React, { useState } from "react";
 +
import { FlatList, SafeAreaView, StatusBar, StyleSheet, Text, TouchableOpacity } from "react-native";
  
* يخبر <code>keyExtractor</code> القائمة باستخدام المعرفات (‎‎<code>id</code>‎‎) لمفاتيح react بدلاً من خاصية المفتاح <code>key</code> الافتراضية.
+
const DATA = [
<syntaxhighlight lang="javascript">
+
  {
class MyListItem extends React.PureComponent {
+
    id: "bd7acbea-c1b1-46c2-aed5-3ad53abb28ba",
   _onPress = () => {
+
    title: "First Item",
     this.props.onPressItem(this.props.id);
+
  },
   };
+
  {
 +
    id: "3ac68afc-c605-48d3-a4f8-fbd91aa97f63",
 +
    title: "Second Item",
 +
  },
 +
   {
 +
     id: "58694a0f-3da1-471f-bd96-145571e29d72",
 +
    title: "Third Item",
 +
   },
 +
];
  
  render() {
+
const Item = ({ item, onPress, backgroundColor, textColor }) => (
    const textColor = this.props.selected ? 'red' : 'black';
+
  <TouchableOpacity onPress={onPress} style={[styles.item, backgroundColor]}>
    return (
+
    <Text style={[styles.title, textColor]}>{item.title}</Text>
      <TouchableOpacity onPress={this._onPress}>
+
  </TouchableOpacity>
        <View>
+
);
          <Text style={{color: textColor}}>{this.props.title}</Text>
 
        </View>
 
      </TouchableOpacity>
 
    );
 
  }
 
}
 
  
class MultiSelectList extends React.PureComponent {
+
const App = () => {
   state = {selected: (new Map(): Map<string, boolean>)};
+
   const [selectedId, setSelectedId] = useState(null);
  
   _keyExtractor = (item, index) => item.id;
+
   const renderItem = ({ item }) => {
 +
    const backgroundColor = item.id === selectedId ? "#6e3b6e" : "#f9c2ff";
 +
    const color = item.id === selectedId ? 'white' : 'black';
  
  _onPressItem = (id: string) => {
+
    return (
    // دوال التحديث مُفضَّلة للتحديثات التعامليّة
+
      <Item
    this.setState((state) => {
+
        item={item}
      // انسخ الترابط
+
        onPress={() => setSelectedId(item.id)}
      const selected = new Map(state.selected);
+
        backgroundColor={{ backgroundColor }}
      selected.set(id, !selected.get(id)); // toggle
+
        textColor={{ color }}
      return {selected};
+
      />
     });
+
     );
 
   };
 
   };
  
   _renderItem = ({item}) => (
+
   return (
    <MyListItem
+
    <SafeAreaView style={styles.container}>
      id={item.id}
+
      <FlatList
      onPressItem={this._onPressItem}
+
        data={DATA}
      selected={!!this.state.selected.get(item.id)}
+
        renderItem={renderItem}
      title={item.title}
+
        keyExtractor={(item) => item.id}
     />
+
        extraData={selectedId}
 +
      />
 +
     </SafeAreaView>
 
   );
 
   );
 +
};
  
   render() {
+
const styles = StyleSheet.create({
     return (
+
   container: {
      <FlatList
+
     flex: 1,
        data={this.props.data}
+
    marginTop: StatusBar.currentHeight || 0,
        extraData={this.state}
+
  },
        keyExtractor={this._keyExtractor}
+
  item: {
        renderItem={this._renderItem}
+
    padding: 20,
      />
+
    marginVertical: 8,
     );
+
    marginHorizontal: 16,
   }
+
  },
}
+
  title: {
 +
     fontSize: 32,
 +
   },
 +
});
 +
 
 +
export default App;
 
</syntaxhighlight>
 
</syntaxhighlight>
  
سطر 95: سطر 163:
 
* لتقييد الذاكرة وتمكين التمرير السلس (smooth scrolling)، يُصيَّر المحتوى على نحو غير متزامن في الخلفيّة. هذا يعني أنه من الممكن التمرير أسرع من معدل التعبئة ورؤية المحتوى الفارغ مؤقتا. هذه مقايضة يمكن تعديلها لتناسب احتياجات كل تطبيق، وسيعمل فريق إطار العمل على تحسين هذا الأمر.
 
* لتقييد الذاكرة وتمكين التمرير السلس (smooth scrolling)، يُصيَّر المحتوى على نحو غير متزامن في الخلفيّة. هذا يعني أنه من الممكن التمرير أسرع من معدل التعبئة ورؤية المحتوى الفارغ مؤقتا. هذه مقايضة يمكن تعديلها لتناسب احتياجات كل تطبيق، وسيعمل فريق إطار العمل على تحسين هذا الأمر.
  
* افتراضيا، تبحث القائمة عن خاصية <code>key</code> في كل عنصر وتستخدم قيمتها كمفتاح React (أو React key). كبديل، يمكنك توفير خاصية <code>keyExtractor</code> مخصصة.
+
* افتراضيا، تبحث القائمة عن خاصية <code>key</code> في كل عنصر وتستخدم قيمتها كمفتاح [[React]] (أو React key). كبديل، يمكنك توفير خاصية <code>keyExtractor</code> مخصصة.
  
يرث هذا المكوّن خاصياتِ المكوّن [https://wiki.hsoub.com/ReactNative/scrollview <code>ScrollView</code>] أيضًا، إلا إذا كان متداخلًا في قائمة FlatList أخرى بنفس الاتجاه.
+
==الخاصيات==
 
+
يرث هذا المكوّن خاصياتِ المكوّن <code>[[ReactNative/scrollview|ScrollView]]</code> أيضًا، إلا إذا كان متداخلًا في قائمة <code>FlatList</code> أخرى بنفس الاتجاه.
==التوابع==
 
* flashScrollIndicators
 
* getScrollResponder
 
* getScrollableNode
 
* scrollToEnd
 
* scrollToIndex
 
* scrollToItem
 
* scrollToOffset
 
* recordInteraction
 
  
==الخاصيات==
 
* <code>[[ReactNative/flatlist#columnWrapperStyle|columnWrapperStyle]]</code>
 
* <code>[[ReactNative/flatlist#data|data]]</code>
 
* extraData
 
* getItemLayout
 
* horizontal
 
* initialNumToRender
 
* initialScrollIndex
 
* inverted
 
* ItemSeparatorComponent
 
* keyExtractor
 
* legacyImplementation
 
* ListEmptyComponent
 
* ListFooterComponent
 
* ListFooterComponentStyle
 
* ListHeaderComponent
 
* ListHeaderComponentStyle
 
* numColumns
 
* onEndReached
 
* onEndReachedThreshold
 
* onRefresh
 
* onViewableItemsChanged
 
* progressViewOffset
 
* refreshing
 
* renderItem
 
* removeClippedSubviews
 
* [https://wiki.hsoub.com/ReactNative/scrollview خاصيات ScrollView]
 
* viewabilityConfig
 
* viewabilityConfigCallbackPairs
 
 
===‎‎<code>renderItem</code>‎‎===  
 
===‎‎<code>renderItem</code>‎‎===  
  
سطر 164: سطر 194:
 
<syntaxhighlight lang="javascript">
 
<syntaxhighlight lang="javascript">
 
<FlatList
 
<FlatList
   ItemSeparatorComponent={Platform.OS !== 'android' && ({highlighted}) => (
+
   ItemSeparatorComponent={
    <View style={[style.separator, highlighted && {marginLeft: 0}]} />
+
    Platform.OS !== 'android' &&
   )}
+
    (({ highlighted }) => (
   data={[{title: 'Title Text', key: 'item1'}]}
+
      <View
   renderItem={({item, index, separators}) => (
+
        style={[
 +
          style.separator,
 +
          highlighted && { marginLeft: 0 }
 +
        ]}
 +
      />
 +
    ))
 +
   }
 +
   data={[{ title: 'Title Text', key: 'item1' }]}
 +
   renderItem={({ item, index, separators }) => (
 
     <TouchableHighlight
 
     <TouchableHighlight
 +
      key={item.key}
 
       onPress={() => this._onPress(item)}
 
       onPress={() => this._onPress(item)}
 
       onShowUnderlay={separators.highlight}
 
       onShowUnderlay={separators.highlight}
 
       onHideUnderlay={separators.unhighlight}>
 
       onHideUnderlay={separators.unhighlight}>
       <View style={{backgroundColor: 'white'}}>
+
       <View style={{ backgroundColor: 'white' }}>
 
         <Text>{item.title}</Text>
 
         <Text>{item.title}</Text>
 
       </View>
 
       </View>
سطر 182: سطر 221:
  
 
===‎‎<code>data</code>‎‎===
 
===‎‎<code>data</code>‎‎===
لتبسيط الأمور، الخاصيّة ‎‎<code>data</code>‎‎ مجرد مصفوفة عادية. إذا أردت استخدام شيء آخر، مثل قائمة غير قابلة للتغيير (immutable list)، فاستخدم مكوّن [https://wiki.hsoub.com/ReactNative/virtualizedlist VirtualizedList] الأساسيّ مباشرةً.
+
لتبسيط الأمور، الخاصيّة ‎‎<code>data</code>‎‎ مجرد مصفوفة عادية. إذا أردت استخدام شيء آخر، مثل قائمة غير قابلة للتغيير (immutable list)، فاستخدم مكوّن [[ReactNative/virtualizedlist|<code>VirtualizedList</code>]] الأساسيّ مباشرةً.
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 203: سطر 242:
  
 
===‎‎<code>ListEmptyComponent</code>‎‎===
 
===‎‎<code>ListEmptyComponent</code>‎‎===
يُصيَّر عندما تكون القائمة فارغة. يمكن أن يكون صنفَ مكونِ React، دالةَ تصييرٍ (‎‎<code>render</code>‎‎)، أو عنصرًا مصيّرًا.
+
يُصيَّر عندما تكون القائمة فارغة. يمكن أن يكون مكون [[React]] (مثل <code>SomeComponent</code>) أو عنصر React (مثل <code><SomeComponent /‎></code>).
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 209: سطر 248:
 
!مطلوب
 
!مطلوب
 
|-
 
|-
|مكون، دالة، عنصر
+
|مكون، عنصر
 
|لا
 
|لا
 
|}
 
|}
  
 
===‎‎<code>ListFooterComponent</code>‎‎===
 
===‎‎<code>ListFooterComponent</code>‎‎===
يُصيّر أسفلَ جميع العناصر. يمكن أن يكون صنفَ مكونِ React، دالةَ تصييرٍ (‎‎<code>render</code>‎‎)، أو عنصرًا مصيّرًا.
+
يُصيّر أسفلَ جميع العناصر. يمكن أن يكون مكون [[React]] (مثل <code>SomeComponent</code>) أو عنصر React (مثل <code><SomeComponent /‎></code>).
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 220: سطر 259:
 
!مطلوب
 
!مطلوب
 
|-
 
|-
|مكون، دالة، عنصر
+
|مكون، عنصر
 
|لا
 
|لا
 
|}
 
|}
  
 
===‎‎<code>ListFooterComponentStyle</code>‎‎===
 
===‎‎<code>ListFooterComponentStyle</code>‎‎===
نمط للعرض الداخلي لمكّون <code>ListFooterComponent</code>.
+
نمط للواجهة <code>View</code> الداخلية لمكّون <code>ListFooterComponent</code>.
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 236: سطر 275:
  
 
===‎‎<code>ListHeaderComponent</code>‎‎===
 
===‎‎<code>ListHeaderComponent</code>‎‎===
يُصيّر أعلى جميع العناصر. يمكن أن يكون صنفَ مكونِ React، دالةَ تصييرٍ (‎‎<code>render</code>‎‎)، أو عنصرًا مصيّرًا.
+
يُصيّر أعلى جميع العناصر. يمكن أن يكون مكون [[React]] (مثل <code>SomeComponent</code>) أو عنصر React (مثل <code><SomeComponent /‎></code>).
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 242: سطر 281:
 
!مطلوب
 
!مطلوب
 
|-
 
|-
|مكون، دالة، عنصر
+
|مكون، عنصر
 
|لا
 
|لا
 
|}
 
|}
سطر 253: سطر 292:
 
!مطلوب
 
!مطلوب
 
|-
 
|-
|كائن نمط (style objects)
+
|[[ReactNative/view style props|كائن نمط (style objects)]]
 
|لا
 
|لا
 
|}
 
|}
سطر 275: سطر 314:
 
!مطلوب
 
!مطلوب
 
|-
 
|-
|أي نوع كيفما كان
+
|أي نوع any
 
|لا
 
|لا
 
|}
 
|}
سطر 283: سطر 322:
 
(data, index) => {length: number, offset: number, index: number}
 
(data, index) => {length: number, offset: number, index: number}
 
</syntaxhighlight>
 
</syntaxhighlight>
<code>getItemLayout</code> هو تحسين اختياري يتيح لنا تخطي قياس المحتوى الديناميكي إذا كنت تعرف أبعاد العناصر في وقت مبكر. يُعَدّ <code>getItemLayout</code> فعالًا وسهل الاستخدام إذا كان لديك عناصر ثابتة الحجم، على سبيل المثال:
+
الخاصية <code>getItemLayout</code> هي تحسين اختياري تتيح لنا تخطي قياس المحتوى الديناميكي إذا كنت تعرف أبعاد العناصر في وقت مبكر. تعَدّ <code>getItemLayout</code> طريقة فعالة وسهلة الاستخدام إذا كان لديك عناصر ثابتة الحجم، على سبيل المثال:
 
<syntaxhighlight lang="javascript">
 
<syntaxhighlight lang="javascript">
 
   getItemLayout={(data, index) => (
 
   getItemLayout={(data, index) => (
سطر 300: سطر 339:
 
|}
 
|}
 
===‎‎<code>horizontal</code>‎‎===
 
===‎‎<code>horizontal</code>‎‎===
في حالة القيمة ‎‎<code>true</code>‎‎، يصيِّر العناصر قرب بعضها البعض أفقيًا بدلاً من تكديسها رأسياً.
+
في حالة القيمة ‎‎<code>true</code>‎‎، يصيِّر العناصر قرب بعضها البعض أفقيًا بدلاً من تكديسها رأسيًا.
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 320: سطر 359:
 
|}
 
|}
 
===‎‎<code>initialScrollIndex</code>‎‎===
 
===‎‎<code>initialScrollIndex</code>‎‎===
بدلاً من البدء من الأعلى بالعنصر الأول، ابدأ من العنصر ذو الفهرَس الموافق للخاصيّة <code>initialScrollIndex</code>. يؤدي هذا إلى تعطيل ميّزة "التمرير إلى أعلى" التي تُحافظ دائمًا على تصيير أول عناصر <code>initialNumToRender</code> وتُصيّر فورًا العناصر بدءًا من هذا الفهرس الأولي. يتطلب تنفيذ <code>getItemLayout</code>.
+
بدلاً من البدء من الأعلى بالعنصر الأول، ابدأ من العنصر ذو الفهرَس الموافق للخاصيّة <code>initialScrollIndex</code>. يؤدي هذا إلى تعطيل ميّزة "التمرير إلى أعلى" التي تُحافظ دائمًا على تصيير أول عناصر <code>initialNumToRender</code> وتُصيّر فورًا العناصر بدءًا من هذا الفهرس الأولي، يتطلب تنفيذ <code>getItemLayout</code>.
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 346: سطر 385:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
يُستخدم لاستخراج مفتاح فريد لعنصر معين في الفهرس المُحدَّد. يُستخدَم المفتاح للتخزين المؤقت وكمفتاح React لتتبع إعادة ترتيب العناصر. يتحقق المستخرج الافتراضي من قيمة <code>item.key</code>، ثم يعود إلى استخدام الفهرس كما يفعل React.
+
يُستخدم لاستخراج مفتاح فريد لعنصر معين في الفهرس المُحدَّد. يُستخدَم المفتاح للتخزين المؤقت وكمفتاح [[React]] لتتبع إعادة ترتيب العناصر. يتحقق المستخرج الافتراضي من قيمة <code>item.key</code>، ثم <code>item.id</code> ثم يعود إلى استخدام الفهرس كما يفعل React.
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 383: سطر 422:
  
 
===‎‎<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"
سطر 409: سطر 448:
  
 
===‎‎<code>onViewableItemsChanged</code>‎‎===
 
===‎‎<code>onViewableItemsChanged</code>‎‎===
<syntaxhighlight lang="javascript">
 
(info: {
 
    viewableItems: array,
 
    changed: array,
 
  }) => void
 
</syntaxhighlight>
 
 
 
يُستدعَى عندما تتغير قابلية عرض (viewability) الصفوف، كما هو مُحدَّد من طرف الخاصية ‎‎<code>viewabilityConfig</code>‎‎.
 
يُستدعَى عندما تتغير قابلية عرض (viewability) الصفوف، كما هو مُحدَّد من طرف الخاصية ‎‎<code>viewabilityConfig</code>‎‎.
  
سطر 422: سطر 454:
 
!مطلوب
 
!مطلوب
 
|-
 
|-
|دالة
+
|دالة<syntaxhighlight lang="js">
 +
(callback: { changed: array of ViewTokens, viewableItems: array of ViewTokens }) => void
 +
 
 +
</syntaxhighlight>
 
|لا
 
|لا
 
|}
 
|}
سطر 431: سطر 466:
 
!النوع
 
!النوع
 
!مطلوب
 
!مطلوب
!المنصة
 
 
|-
 
|-
 
|عدد
 
|عدد
|لا
 
|Android
 
|}
 
 
===‎‎<code>legacyImplementation</code>‎‎===
 
طريقة عمل المكون القديمة، قد لا تكون لها ميزة تكافؤ كاملة وهي للتنقيح ومقارنة الأداء.
 
 
{| class="wikitable"
 
!النوع
 
!مطلوب
 
|-
 
|قيمة منطقية
 
 
|لا
 
|لا
 
|}
 
|}
سطر 460: سطر 482:
 
|}
 
|}
 
===‎‎<code>removeClippedSubviews</code>‎‎===
 
===‎‎<code>removeClippedSubviews</code>‎‎===
قد يؤدي هذا إلى تحسين أداء التمرير للقوائم الكبيرة.
+
قد يؤدي هذا إلى تحسين أداء التمرير للقوائم الكبيرة. القيمة الافتراضية على منصة Android هي <code>true</code>.
  
 
'''ملاحظة:''' قد تكون هناك أخطاء (محتوى مفقود) في بعض الحالات. استخدمها على مسؤوليتك.
 
'''ملاحظة:''' قد تكون هناك أخطاء (محتوى مفقود) في بعض الحالات. استخدمها على مسؤوليتك.
سطر 473: سطر 495:
  
 
===‎‎<code>viewabilityConfig</code>‎‎===
 
===‎‎<code>viewabilityConfig</code>‎‎===
انظر [https://github.com/facebook/react-native/blob/0ee5f68929610106ee6864baa04ea90be0fc5160/Libraries/Lists/ViewabilityHelper.js <code>ViewabilityHelper.js</code>‎]‎‎‎‎ لمعرفة نوع flow ولتوثيق أكثر.
+
انظر [https://github.com/facebook/react-native/blob/0ee5f68929610106ee6864baa04ea90be0fc5160/Libraries/Lists/ViewabilityHelper.js <code>ViewabilityHelper.js</code>‎]‎‎‎‎ لمعرفة نوع التدفق flow ولتفاصيل أكثر.
  
 
{| class="wikitable"
 
{| class="wikitable"
سطر 483: سطر 505:
 
|}
 
|}
  
تأخذ <code>viewabilityConfig</code> نوع <code>ViewabilityConfig</code>، وهو كائن ذو الخاصيات التالية
+
تأخذ الخاصية <code>viewabilityConfig</code> نوع <code>ViewabilityConfig</code>، وهو كائن ذو الخاصيات التالية:
 
{| class="wikitable"
 
{| class="wikitable"
 
!الخاصية
 
!الخاصية
!مطلوب
 
 
!النوع
 
!النوع
 
|-
 
|-
 
|<code>minimumViewTime</code>
 
|<code>minimumViewTime</code>
|لا
 
 
|عدد
 
|عدد
 
|-
 
|-
 
|<code>viewAreaCoveragePercentThreshold</code>
 
|<code>viewAreaCoveragePercentThreshold</code>
|لا
 
 
|عدد
 
|عدد
 
|-
 
|-
 
|<code>itemVisiblePercentThreshold</code>
 
|<code>itemVisiblePercentThreshold</code>
|لا
 
 
|عدد
 
|عدد
 
|-
 
|-
 
|<code>waitForInteraction</code>
 
|<code>waitForInteraction</code>
|لا
 
 
|قيمة منطقية
 
|قيمة منطقية
 
|}
 
|}
سطر 509: سطر 526:
  
 
<syntaxhighlight lang="javascript">
 
<syntaxhighlight lang="javascript">
   Error: Changing viewabilityConfig on the fly is not supported`
+
   Error: Changing viewabilityConfig on the fly is not supported
 
</syntaxhighlight>
 
</syntaxhighlight>
  
سطر 533: سطر 550:
  
 
====‎‎<code>viewAreaCoveragePercentThreshold</code>‎‎====
 
====‎‎<code>viewAreaCoveragePercentThreshold</code>‎‎====
نسبة منفذ العرض (viewport) الواجب تغطيتها لعنصر مغلق جزئيًا (partially occluded) ليُعدَّ على أنه "قابل للعرض (viewable)"، من 0 إلى 100. تُعدّ العناصر المرئية بالكامل قابلة للعرض دائمًا. تعني القيمة 0 أن بِكْسِل واحد في منفذ العرض يجعل العنصر قابلاً للعرض، والقيمة 100 تعني أن العنصر إما يجب أن يكون مرئيًا تمامًا أو يغطي منفذ العرض بالكامل ليُعدّ قابلًا للعرض.
+
نسبة إطار العرض (viewport) الواجب تغطيتها لعنصر مغلق جزئيًا (partially occluded) ليُعدَّ على أنه "قابل للعرض (viewable)"، من 0 إلى 100. تُعدّ العناصر المرئية بالكامل قابلة للعرض دائمًا. تعني القيمة 0 أن بِكْسِل واحد في منفذ العرض يجعل العنصر قابلاً للعرض، والقيمة 100 تعني أن العنصر إما يجب أن يكون مرئيًا تمامًا أو يغطي منفذ العرض بالكامل ليُعدّ قابلًا للعرض.
  
 
====‎‎<code>itemVisiblePercentThreshold</code>‎‎====
 
====‎‎<code>itemVisiblePercentThreshold</code>‎‎====
يشبه <code>viewAreaCoveragePercentThreshold</code>، ولكنه يأخذ في الاعتبار نسبة العنصر المرئي، بدلاً من جزءٍ من المساحة القابلة للعرض التي يغطّيها.
+
تشبه <code>viewAreaCoveragePercentThreshold</code>، ولكنها تأخذ في الاعتبار نسبة العنصر المرئي، بدلًا من جزءٍ من المساحة القابلة للعرض التي يغطّيها.
  
 
====‎‎<code>waitForInteraction</code>‎‎====
 
====‎‎<code>waitForInteraction</code>‎‎====
سطر 542: سطر 559:
 
===‎‎<code>viewabilityConfigCallbackPairs</code>‎‎===
 
===‎‎<code>viewabilityConfigCallbackPairs</code>‎‎===
  
قائمة أزواج <code>ViewabilityConfig</code> / <code>onViewableItemsChanged</code>. ستُستدعى دالة <code>onViewableItemsChanged</code> مُعيّنة عند استيفاء شروط <code>ViewabilityConfig</code> ذات العلاقة.
+
قائمة أزواج <code>ViewabilityConfig</code> / <code>onViewableItemsChanged</code>.  
 +
 
 +
ستُستدعى الدالة <code>onViewableItemsChanged</code> عند استيفاء شروط <code>ViewabilityConfig</code> ذات العلاقة.
  
 
انظر [https://github.com/facebook/react-native/blob/0ee5f68929610106ee6864baa04ea90be0fc5160/Libraries/Lists/ViewabilityHelper.js <code>ViewabilityHelper.js</code>‎]‎‎‎‎ لمعرفة نوع flow ولتوثيق أكثر.
 
انظر [https://github.com/facebook/react-native/blob/0ee5f68929610106ee6864baa04ea90be0fc5160/Libraries/Lists/ViewabilityHelper.js <code>ViewabilityHelper.js</code>‎]‎‎‎‎ لمعرفة نوع flow ولتوثيق أكثر.
سطر 555: سطر 574:
  
 
==التوابع==
 
==التوابع==
 +
 +
===‎‎<code>flashScrollIndicators()</code>‎‎===
 +
<syntaxhighlight lang="javascript">
 +
flashScrollIndicators();
 +
</syntaxhighlight>
 +
يعرض مؤشرات التمرير مؤقتا.
 +
===‎‎<code>getNativeScrollRef()</code>‎‎===
 +
<syntaxhighlight lang="javascript">
 +
getNativeScrollRef();
 +
 +
</syntaxhighlight>
 +
يوفر مرجعًا إلى مكون التمرير  الأساسي.
 +
===‎‎<code>getScrollResponder()</code>‎‎===
 +
<syntaxhighlight lang="javascript">
 +
getScrollResponder();
 +
</syntaxhighlight>
 +
يوفر مقبضًا (handle) لمستجيب التمرير الأساسي.
 +
 +
===‎‎<code>getScrollableNode()</code>‎‎===
 +
<syntaxhighlight lang="javascript">
 +
getScrollableNode();
 +
</syntaxhighlight>
 +
يوفر مقبضًا لعقدة التمرير الأساسية.
 +
 +
===‎‎<code>recordInteraction()</code>‎‎===
 +
<syntaxhighlight lang="javascript">
 +
recordInteraction();
 +
</syntaxhighlight>
 +
 +
يخبر القائمة بحدوث تفاعل ما، والذي يجب أن يشغّل حسابات قابلية العرض (viewability calculations)، على سبيل المثال، إذا كان <code>waitForInteractions</code> ذا قيمةٍ صحيحة (‎‎<code>true</code>‎‎) ولم يمرِّر المستخدم. يُستدعى هذا عادةً عن طريق النقر على العناصر أو عن طريق إجراءات التنقل.
  
 
===‎‎<code>scrollToEnd()</code>‎‎===
 
===‎‎<code>scrollToEnd()</code>‎‎===
سطر 562: سطر 611:
 
يُمرِّر إلى نهاية المحتوى. قد يعمل بشكل سيّئٍ دون الخاصية <code>getItemLayout</code>.
 
يُمرِّر إلى نهاية المحتوى. قد يعمل بشكل سيّئٍ دون الخاصية <code>getItemLayout</code>.
  
====المعاملات:====
+
المعاملات:
 
{| class="wikitable"
 
{| class="wikitable"
 
!الاسم
 
!الاسم
سطر 583: سطر 632:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
تُمرِّر إلى العنصر الموجود في الفهرس المُحدَّد بحيث يوضع في المنطقة القابلة للعرض، بحيث يضعه <code>viewPosition</code>  بالقيمة <code>0</code> في الأعلى، و<code>1</code> في الأسفل، و <code>0.5</code> في المنتصف.
+
تُمرِّر إلى العنصر الموجود في الفهرس المُحدَّد بحيث يوضع في المنطقة القابلة للعرض، بحيث يضعه <code>viewPosition</code>  بالقيمة <code>0</code> في الأعلى، والقيمة <code>1</code> في الأسفل، والقيمة <code>0.5</code> في المنتصف.
  
 
'''ملاحظة:''' لا يمكن التمرير إلى مواقع خارج نافذة التصيير دون تحديد الخاصية <code>getItemLayout</code>.
 
'''ملاحظة:''' لا يمكن التمرير إلى مواقع خارج نافذة التصيير دون تحديد الخاصية <code>getItemLayout</code>.
  
====المعاملات:====
+
المعاملات:
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
!الاسم
 
!الاسم
سطر 612: سطر 660:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
يتطلب مسح البيانات (data) خطّيًّا، استخدم <code>scrollToIndex</code> بدلاً منه إن أمكن.
+
يُمرِّر القائمة إلى العنصر المحدد، ويتطلب مسح البيانات (data) خطّيًّا، استخدم <code>scrollToIndex</code> بدلاً منه إن أمكن.
  
 
'''ملاحظة:''' لا يمكن التمرير إلى مواقع خارج نافذة التصيير دون تحديد الخاصية <code>getItemLayout</code>.
 
'''ملاحظة:''' لا يمكن التمرير إلى مواقع خارج نافذة التصيير دون تحديد الخاصية <code>getItemLayout</code>.
  
====المعاملات:====
+
المعاملات:
 
 
 
{| class="wikitable"
 
{| class="wikitable"
 
!الاسم
 
!الاسم
سطر 639: سطر 686:
 
scrollToOffset(params);
 
scrollToOffset(params);
 
</syntaxhighlight>
 
</syntaxhighlight>
مرّر إلى إزاحة بكسل لمحتوى (content pixel offset) معين في القائمة.
+
مرّر إلى محتوى معين في القائمة المزاح بقيمة محددة بالبكسل (content pixel offset).
 
 
====المعاملات:====
 
  
 +
المعاملات:
 
{| class="wikitable"
 
{| class="wikitable"
 
!الاسم
 
!الاسم
سطر 657: سطر 703:
 
مفاتيح <code>params</code> الصالحة هي:
 
مفاتيح <code>params</code> الصالحة هي:
  
* ‎‎<code>'offset'</code>‎‎ (عدد): الإزاحة المرغوب التمرير إليها. في حالة كانت قيمةُ horizontal القيمةَ ‎‎<code>true</code>‎‎، فالإزاحة هي القيمة x، وفي أي حالة أخرى، تكون الإزاحة هي القيمة y. مطلوب.
+
* ‎‎<code>'offset'</code>‎‎ (عدد): الإزاحة المرغوب التمرير إليها. في حالة كانت قيمةُ <code>horizontal</code> القيمةَ ‎‎<code>true</code>‎‎، فالإزاحة هي القيمة x، وفي أي حالة أخرى، تكون الإزاحة هي القيمة y. مطلوب.
  
 
* ‎‎<code>'animated'</code>‎‎ (قيمة منطقيّة): ما إذا وجَب تحريك القائمة أثناء التمرير.
 
* ‎‎<code>'animated'</code>‎‎ (قيمة منطقيّة): ما إذا وجَب تحريك القائمة أثناء التمرير.
 
===‎‎<code>recordInteraction()</code>‎‎===
 
<syntaxhighlight lang="javascript">
 
recordInteraction();
 
</syntaxhighlight>
 
 
يخبر القائمة بحدوث تفاعل ما، والذي يجب أن يشغّل حسابات قابلية العرض (viewability calculations)، على سبيل المثال، إذا كان <code>waitForInteractions</code> ذا قيمةٍ صحيحة (‎‎<code>true</code>‎‎) ولم يمرِّر المستخدم. يُستدعى هذا عادةً عن طريق النقر على العناصر أو عن طريق إجراءات التنقل.
 
 
===‎‎<code>flashScrollIndicators()</code>‎‎===
 
<syntaxhighlight lang="javascript">
 
flashScrollIndicators();
 
</syntaxhighlight>
 
يعرض مؤشرات التمرير مؤقتا.
 
===‎‎<code>getScrollResponder()</code>‎‎===
 
<syntaxhighlight lang="javascript">
 
getScrollResponder();
 
</syntaxhighlight>
 
يوفر مقبضًا (handle) لمستجيب التمرير الأساسي.
 
 
===‎‎<code>GetScrollableNode()</code>‎‎===
 
<syntaxhighlight lang="javascript">
 
getScrollableNode();
 
</syntaxhighlight>
 
يوفر مقبضًا لعقدة التمرير الأساسية.
 
  
 
== مصادر ==
 
== مصادر ==
 
* [https://facebook.github.io/react-native/docs/flatlist صفحة FlatList في توثيق React Native الرسمي.]
 
* [https://facebook.github.io/react-native/docs/flatlist صفحة FlatList في توثيق React Native الرسمي.]
 
[[تصنيف:ReactNative]]
 
[[تصنيف:ReactNative]]
 +
[[تصنيف:React Native Component]]

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

واجهة عالية الأداء لتصيير قوائم مسطحة بسيطة تدعم الميزات الأكثر فائدة:

  • عابر منصات (أو متعدّد المنصات: cross-platform) بالكامل.
  • وضع أفقي اختياري.
  • دوال رد نداء قابلة للضبط للتحكم بقابلية العرض (viewability callbacks).
  • دعم الترويسة (Header).
  • دعم التذييل (Footer).
  • دعم الفواصل.
  • التحديث بالسحب.
  • التحميل أثناء التمرير (Scroll loading).
  • دعم التمرير إلى فهرس باستخدام ScrollToIndex.
  • دعم الأعمدة المتعددة.

إذا احتجت لاستعمال الأقسام، فاستخدم <SectionList>.

إليك مقال بسيط (تجربة حية):

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

const DATA = [
  {
    id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba',
    title: 'First Item',
  },
  {
    id: '3ac68afc-c605-48d3-a4f8-fbd91aa97f63',
    title: 'Second Item',
  },
  {
    id: '58694a0f-3da1-471f-bd96-145571e29d72',
    title: 'Third Item',
  },
];

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

const App = () => {
  const renderItem = ({ item }) => (
    <Item title={item.title} />
  );

  return (
    <SafeAreaView style={styles.container}>
      <FlatList
        data={DATA}
        renderItem={renderItem}
        keyExtractor={item => item.id}
      />
    </SafeAreaView>
  );
}

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

export default App;

لتصيير أعمدة متعددة، استخدم خاصية numColumns يمكن أن يؤدي استخدام هذا الأسلوب بدلاً من تخطيط flexWrap إلى منع التعارضات مع منطق ارتفاع العنصر (item height logic).

إليك مثال أعقد:

  • بتمرير ‎‎extraData={selectedId}‎‎ إلى FlatList، نتأكد من إعادة تصيير FlatList نفسه عندما يحدث تغير في الحالة‎‎. إذا لم تُعيَّن هذه الخاصية فلن يعلم مكوّن FlatList أنه يحتاج إلى إعادة تصيير أي عناصر لأنه أيضًا مكوِّنٌ من النوع PureComponent ولن تعرض مقارنة الخاصيات أي تغييرات.
  • يخبر keyExtractor القائمة باستخدام المعرفات (‎‎id‎‎) لمفاتيح react بدلاً من خاصية المفتاح key الافتراضية.

شيفرة المثال (تجربة حية):

import React, { useState } from "react";
import { FlatList, SafeAreaView, StatusBar, StyleSheet, Text, TouchableOpacity } from "react-native";

const DATA = [
  {
    id: "bd7acbea-c1b1-46c2-aed5-3ad53abb28ba",
    title: "First Item",
  },
  {
    id: "3ac68afc-c605-48d3-a4f8-fbd91aa97f63",
    title: "Second Item",
  },
  {
    id: "58694a0f-3da1-471f-bd96-145571e29d72",
    title: "Third Item",
  },
];

const Item = ({ item, onPress, backgroundColor, textColor }) => (
  <TouchableOpacity onPress={onPress} style={[styles.item, backgroundColor]}>
    <Text style={[styles.title, textColor]}>{item.title}</Text>
  </TouchableOpacity>
);

const App = () => {
  const [selectedId, setSelectedId] = useState(null);

  const renderItem = ({ item }) => {
    const backgroundColor = item.id === selectedId ? "#6e3b6e" : "#f9c2ff";
    const color = item.id === selectedId ? 'white' : 'black';

    return (
      <Item
        item={item}
        onPress={() => setSelectedId(item.id)}
        backgroundColor={{ backgroundColor }}
        textColor={{ color }}
      />
    );
  };

  return (
    <SafeAreaView style={styles.container}>
      <FlatList
        data={DATA}
        renderItem={renderItem}
        keyExtractor={(item) => item.id}
        extraData={selectedId}
      />
    </SafeAreaView>
  );
};

const styles = StyleSheet.create({
  container: {
    flex: 1,
    marginTop: StatusBar.currentHeight || 0,
  },
  item: {
    padding: 20,
    marginVertical: 8,
    marginHorizontal: 16,
  },
  title: {
    fontSize: 32,
  },
});

export default App;

هذا مغلِّف ملائم حول <VirtualizedList>، وبالتالي فإنّه يرث خاصياته (بالإضافة إلى خاصيات <ScrollView>) التي لم تُصنَّف بشكل صريح هنا، إضافةً إلى التحذيرات التالية:

  • لا يُحتفظ بالحالة الداخلية عند تمرير (scroll) المحتوى خارج نافذة التصيير. تأكد من تسجيل جميع بياناتك في بيانات العنصر أو المخازن الخارجية مثل Flux أو Redux أو Relay.
  • هذا مكوّنُ PureComponent، ما يعني أنه لن يعاد تصييره إذا ظلت الخاصيات ‎‎props‎‎ متساويّةً سَطحيًّا (shallow-equal). تأكّد من تمرير كل ما تعتمد عليه دالة renderItem كخاصياتٍ (مثل extraData) لا تكون متساويًّةً (‎‎===‎‎) بعد التحديثات، وإلا فقد لا تُحدَّث واجهة مستخدمك عند حدوث التغييرات. يتضمن هذا خاصية data وحالة المكون الأب.
  • لتقييد الذاكرة وتمكين التمرير السلس (smooth scrolling)، يُصيَّر المحتوى على نحو غير متزامن في الخلفيّة. هذا يعني أنه من الممكن التمرير أسرع من معدل التعبئة ورؤية المحتوى الفارغ مؤقتا. هذه مقايضة يمكن تعديلها لتناسب احتياجات كل تطبيق، وسيعمل فريق إطار العمل على تحسين هذا الأمر.
  • افتراضيا، تبحث القائمة عن خاصية key في كل عنصر وتستخدم قيمتها كمفتاح React (أو React key). كبديل، يمكنك توفير خاصية keyExtractor مخصصة.

الخاصيات

يرث هذا المكوّن خاصياتِ المكوّن ScrollView أيضًا، إلا إذا كان متداخلًا في قائمة FlatList أخرى بنفس الاتجاه.

‎‎renderItem‎‎

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

تُوفر بيانات وصفية إضافية مثل index إذا احتجتها، بالإضافة إلى دالة separators.updateProps أكثر عمومية، والتي تتيح لك تعيين الخاصيات التي تريد تغيير تصييرها إما بفاصل سابق (leading separator) أو بفاصل لاحِق (trailing separator)، وهذا في حالة كانت highlight أو unhighlight الأكثر شيوعًا (والتي تعيّن خاصية highlighted: boolean) غيرَ كافيةٍ بالنسبة لك.

النوع مطلوب
دالة نعم
  • item (كائن): العنصر قيد التصيير من عناصر data.
  • index (عدد): الفهرس المقابل لهذا العنصر في مصفوفة data.
  • separators (كائن)
    • highlight (دالة)
    • unhighlight (دالة)
    • updateProps (دالة)
      • ‎select ‎ : ثابت متعدّد enum('leading', 'trailing')
      • newProps (كائن)

مثال:

<FlatList
  ItemSeparatorComponent={
    Platform.OS !== 'android' &&
    (({ highlighted }) => (
      <View
        style={[
          style.separator,
          highlighted && { marginLeft: 0 }
        ]}
      />
    ))
  }
  data={[{ title: 'Title Text', key: 'item1' }]}
  renderItem={({ item, index, separators }) => (
    <TouchableHighlight
      key={item.key}
      onPress={() => this._onPress(item)}
      onShowUnderlay={separators.highlight}
      onHideUnderlay={separators.unhighlight}>
      <View style={{ backgroundColor: 'white' }}>
        <Text>{item.title}</Text>
      </View>
    </TouchableHighlight>
  )}
/>

‎‎data‎‎

لتبسيط الأمور، الخاصيّة ‎‎data‎‎ مجرد مصفوفة عادية. إذا أردت استخدام شيء آخر، مثل قائمة غير قابلة للتغيير (immutable list)، فاستخدم مكوّن VirtualizedList الأساسيّ مباشرةً.

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

‎‎ItemSeparatorComponent‎‎

يُصيَّر بين كل عنصر، ولكن ليس في الجزء العلوي أو السفلي. افتراضيًا، تُوفَّر خاصيات highlighted و leadingItem. يوفر renderItem كلا من separators.highlight و separators.unhighlight والذي سيحدِّث خاصية highlighted، ولكن يمكنك أيضًا إضافة خاصيات مخصصةٍ باستخدام separators.updateProps.

النوع مطلوب
مكوّن لا

‎‎ListEmptyComponent‎‎

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

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

‎‎ListFooterComponent‎‎

يُصيّر أسفلَ جميع العناصر. يمكن أن يكون مكون React (مثل SomeComponent) أو عنصر React (مثل <SomeComponent /‎>).

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

‎‎ListFooterComponentStyle‎‎

نمط للواجهة View الداخلية لمكّون ListFooterComponent.

النوع مطلوب
كائن نمط (style object) لا

‎‎ListHeaderComponent‎‎

يُصيّر أعلى جميع العناصر. يمكن أن يكون مكون React (مثل SomeComponent) أو عنصر React (مثل <SomeComponent /‎>).

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

‎‎ListHeaderComponentStyle‎‎

نمط العرض الداخلي للمكوّن ListHeaderComponent.

النوع مطلوب
كائن نمط (style objects) لا

‎‎columnWrapperStyle‎‎

نمط مخصص اختياري للصفوف متعددة العناصر المولّدة عند تحّقق الشرط numColumns > 1.

النوع مطلوب
كائن نمط لا

‎‎extraData‎‎

خاصية تعليم (marker property) لإخبار القائمة بإعادة التصيير (نظرًا لأنها تنفّذ PureComponent). إذا كانت أي من دوالك renderItem، و Header، و Footer، وما إلى ذلك، تعتمد على أي شيء خارج خاصية data، فضعها هنا وعالجها بطريقة غير قابلة للتغيير (immutably).

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

‎‎getItemLayout‎‎

(data, index) => {length: number, offset: number, index: number}

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

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

يمكن أن تكون إضافة getItemLayout بمثابة تعزيز أداء رائع لقوائم تضم مئات العناصر. تذكر تضمين طول الفاصل (الارتفاع أو العرض) في حساب الإزاحة إذا قمت بتحديد ItemSeparatorComponent.

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

‎‎horizontal‎‎

في حالة القيمة ‎‎true‎‎، يصيِّر العناصر قرب بعضها البعض أفقيًا بدلاً من تكديسها رأسيًا.

النوع مطلوب
قيمة منطقية لا

‎‎initialNumToRender‎‎

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

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

‎‎initialScrollIndex‎‎

بدلاً من البدء من الأعلى بالعنصر الأول، ابدأ من العنصر ذو الفهرَس الموافق للخاصيّة initialScrollIndex. يؤدي هذا إلى تعطيل ميّزة "التمرير إلى أعلى" التي تُحافظ دائمًا على تصيير أول عناصر initialNumToRender وتُصيّر فورًا العناصر بدءًا من هذا الفهرس الأولي، يتطلب تنفيذ getItemLayout.

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

‎‎inverted‎‎

يعكس اتجاه التمرير. يستخدم تحويلات المقدار ‎‎-1‎‎.

النوع مطلوب
قيمة منطقية لا

‎‎keyExtractor‎‎

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

يُستخدم لاستخراج مفتاح فريد لعنصر معين في الفهرس المُحدَّد. يُستخدَم المفتاح للتخزين المؤقت وكمفتاح React لتتبع إعادة ترتيب العناصر. يتحقق المستخرج الافتراضي من قيمة item.key، ثم item.id ثم يعود إلى استخدام الفهرس كما يفعل React.

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

‎‎numColumns‎‎

يمكن تصيير أعمدة متعددة فقط باستعمال ‎‎horizontal={false}‎‎ وسيتعرّج مثل تخطيط flexWrap. يجب أن تكون جميع العناصر بنفس الارتفاع - تخطيطات البناء (masonry layouts) غير مدعومة.

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

‎‎onEndReached‎‎

(info: {distanceFromEnd: number}) => void

يُستدعى مرة واحدة عندما يكون موضع التمرير ضمن مجال ‎‎onEndReachedThreshold‎‎ للمحتوى المصيّر.

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

‎‎onEndReachedThreshold‎‎

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

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

‎‎onRefresh‎‎

() => void

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

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

‎‎onViewableItemsChanged‎‎

يُستدعَى عندما تتغير قابلية عرض (viewability) الصفوف، كما هو مُحدَّد من طرف الخاصية ‎‎viewabilityConfig‎‎.

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

‎‎progressViewOffset‎‎

عيِّن هذه الخاصيّة عند الحاجة إلى الإزاحة ليظهر مؤشر التحميل بشكل صحيح.

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

‎‎refreshing‎‎

عيّن لها القيمة ‎‎true‎‎ أثناء انتظار بيانات جديدة من تحديث ما.

النوع مطلوب
قيمة منطقية لا

‎‎removeClippedSubviews‎‎

قد يؤدي هذا إلى تحسين أداء التمرير للقوائم الكبيرة. القيمة الافتراضية على منصة Android هي true.

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

النوع مطلوب
قيمة منطقية لا

‎‎viewabilityConfig‎‎

انظر ViewabilityHelper.js‎‎‎‎ لمعرفة نوع التدفق flow ولتفاصيل أكثر.

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

تأخذ الخاصية viewabilityConfig نوع ViewabilityConfig، وهو كائن ذو الخاصيات التالية:

الخاصية النوع
minimumViewTime عدد
viewAreaCoveragePercentThreshold عدد
itemVisiblePercentThreshold عدد
waitForInteraction قيمة منطقية

أحد هذين على الأقل مطلوب: viewAreaCoveragePercentThreshold أو itemVisiblePercentThreshold. يجب القيام بهذا في دالة البناء constructor لتجنب الخطأ التالي (المرجع):

  Error: Changing viewabilityConfig on the fly is not supported
constructor (props) {
  super(props)

  this.viewabilityConfig = {
      waitForInteraction: true,
      viewAreaCoveragePercentThreshold: 95
  }
}
<FlatList
    viewabilityConfig={this.viewabilityConfig}
  ...

‎‎minimumViewTime‎‎

الحد الأدنى من الوقت (بالمللي ثانية) الذي يجب أن يكون العنصر فيه قابلا للعرض فعليًا قبل إطلاق دالة رد نداء قابلية العرض (viewability callback). العدد الكبير يعني أن التمرير خلال المحتوى دون توقف لن يؤدي إلى تمييز المحتوى على أنه قابل للعرض.

‎‎viewAreaCoveragePercentThreshold‎‎

نسبة إطار العرض (viewport) الواجب تغطيتها لعنصر مغلق جزئيًا (partially occluded) ليُعدَّ على أنه "قابل للعرض (viewable)"، من 0 إلى 100. تُعدّ العناصر المرئية بالكامل قابلة للعرض دائمًا. تعني القيمة 0 أن بِكْسِل واحد في منفذ العرض يجعل العنصر قابلاً للعرض، والقيمة 100 تعني أن العنصر إما يجب أن يكون مرئيًا تمامًا أو يغطي منفذ العرض بالكامل ليُعدّ قابلًا للعرض.

‎‎itemVisiblePercentThreshold‎‎

تشبه viewAreaCoveragePercentThreshold، ولكنها تأخذ في الاعتبار نسبة العنصر المرئي، بدلًا من جزءٍ من المساحة القابلة للعرض التي يغطّيها.

‎‎waitForInteraction‎‎

لا يمكن اعتبار أي شيء قابلاً للعرض حتى يمرِّر المستخدم أو عند استدعاء recordInteraction بعد التصيير.

‎‎viewabilityConfigCallbackPairs‎‎

قائمة أزواج ViewabilityConfig / onViewableItemsChanged.

ستُستدعى الدالة onViewableItemsChanged عند استيفاء شروط ViewabilityConfig ذات العلاقة.

انظر ViewabilityHelper.js‎‎‎‎ لمعرفة نوع flow ولتوثيق أكثر.

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

التوابع

‎‎flashScrollIndicators()‎‎

flashScrollIndicators();

يعرض مؤشرات التمرير مؤقتا.

‎‎getNativeScrollRef()‎‎

getNativeScrollRef();

يوفر مرجعًا إلى مكون التمرير الأساسي.

‎‎getScrollResponder()‎‎

getScrollResponder();

يوفر مقبضًا (handle) لمستجيب التمرير الأساسي.

‎‎getScrollableNode()‎‎

getScrollableNode();

يوفر مقبضًا لعقدة التمرير الأساسية.

‎‎recordInteraction()‎‎

recordInteraction();

يخبر القائمة بحدوث تفاعل ما، والذي يجب أن يشغّل حسابات قابلية العرض (viewability calculations)، على سبيل المثال، إذا كان waitForInteractions ذا قيمةٍ صحيحة (‎‎true‎‎) ولم يمرِّر المستخدم. يُستدعى هذا عادةً عن طريق النقر على العناصر أو عن طريق إجراءات التنقل.

‎‎scrollToEnd()‎‎

scrollToEnd([params]);

يُمرِّر إلى نهاية المحتوى. قد يعمل بشكل سيّئٍ دون الخاصية getItemLayout.

المعاملات:

الاسم النوع مطلوب الوصف
params كائن لا أنظر أدناه

مفاتيح params الصالحة هي:

  • ‎‎'animated'‎‎ (قيمة منطقيّة): ما إذا وجَب تحريك القائمة أثناء التمرير. ‎‎true‎‎ افتراضيًا.

‎‎scrollToIndex()‎‎

scrollToIndex(params);

تُمرِّر إلى العنصر الموجود في الفهرس المُحدَّد بحيث يوضع في المنطقة القابلة للعرض، بحيث يضعه viewPosition بالقيمة 0 في الأعلى، والقيمة 1 في الأسفل، والقيمة 0.5 في المنتصف.

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

المعاملات:

الاسم النوع مطلوب الوصف
params كائن نعم أنظر أدناه

مفاتيح params الصالحة هي:

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

‎‎scrollToItem()‎‎

scrollToItem(params);

يُمرِّر القائمة إلى العنصر المحدد، ويتطلب مسح البيانات (data) خطّيًّا، استخدم scrollToIndex بدلاً منه إن أمكن.

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

المعاملات:

الاسم النوع مطلوب الوصف
params كائن نعم أنظر أدناه

مفاتيح params الصالحة هي:

  • ‎‎'animated'‎‎ (قيمة منطقيّة): ما إذا وجَب تحريك القائمة أثناء التمرير. ‎‎true‎‎ افتراضيًا.
  • 'item' (كائن): العنصر المرغوب التمرير إليه. مطلوب.
  • 'viewPosition' (عدد).

‎‎scrollToOffset()‎‎

scrollToOffset(params);

مرّر إلى محتوى معين في القائمة المزاح بقيمة محددة بالبكسل (content pixel offset).

المعاملات:

الاسم النوع مطلوب الوصف
params كائن نعم أنظر أدناه

مفاتيح params الصالحة هي:

  • ‎‎'offset'‎‎ (عدد): الإزاحة المرغوب التمرير إليها. في حالة كانت قيمةُ horizontal القيمةَ ‎‎true‎‎، فالإزاحة هي القيمة x، وفي أي حالة أخرى، تكون الإزاحة هي القيمة y. مطلوب.
  • ‎‎'animated'‎‎ (قيمة منطقيّة): ما إذا وجَب تحريك القائمة أثناء التمرير.

مصادر