في هذه المقالة ، لن أخبرك أنك تحتاج إلى استخدام أقل قدر ممكن من المحتوى لعرض الصور أو تخزينها مؤقتًا. لا! سنتحدث فقط عن تحسين القائمة الحقيقية ولا يهم ما نحتاج إلى عرضه ، لأنه إذا قال العميل أنني أريد ولا يمكنك الجدال معه.
لنبدأ بأبسط مثال. لنفترض أن لدينا مصفوفة.
const list = [{ _id: 567456, label: “CodingChipmunks” }, ...]
ما هي أسهل طريقة لتقديم قائمة صغيرة؟ من الصحيح استخدام طريقة .map
تُرجع مصفوفة جديدة ويمكننا عرض القائمة بالكامل. حسنًا ، دعنا نلقي نظرة على أحد الأمثلة:
render() {
return (
<View>
{list.map((item) => (
<View>
<Text>{item.label}</Text>
<View>))}
</View>
)
}
بشكل صحيح؟ لا! لا تفعل ذلك مطلقا!
- أولاً ، تحتاج دائمًا إلى تحديد المفتاح لكل عنصر. ويرجى عدم استخدامه لعنصر الفهرس هذا في المصفوفة. أدناه سأخبرك لماذا.
- ثانيًا ، يبدو الرمز فوضويًا
- ثالثًا ، لا تستخدم وظائف مجهولة
لماذا لا تفعل ذلك على هذا النحو:
renderItem = (item) => (
<View key={item._id}>
<Text>{item.label}</Text>
<View>
)
render() {
return (
<View>
{list.map((item) => this.renderItem(item)}
</View>)
}
أو هكذا:
const Item = (item) => (
<View >
<Text>{item.label}</Text>
<View>
)
class List extends React.Component {
…
render() {
return (
<View>
{list.map((item) => <Item key={item._id} />}
</View>)
}
}
هل هو أفضل بكثير الآن؟ ليس صحيحا.
. .map
. render item . . . - . ? ,
.
“? ? ? ?” .
:
render() {
return (
<View>
{list.map(this.renderItem)}
</View>
)
}
PureComponent item.
!
class Item extends React.PureComponent {
...
}
!
?
. . ? FlatList. Flatlist ? . .
:
const list = [loyaltyCard1, loyaltyCard2, … , loyaltyCard100];
…
renderItem = ({ item: loyaltyCard, index }) => (...)
keyExtractor = loyaltyCard => loyaltyCard._id
render() {
<FlatList
keyExtractor={this.keyExtractor}
data={list}
renderItem={this.renderItem} />
}
key
, keyExtractor
, .
renderItem :
- item —
- index —
- separator —
?
, extraData
. .
getItemLayout.
ReactNative
getItemLayout={(data, index) => (
{length: ITEM_HEIGHT, offset: ITEM_HEIGHT * index, index}
)}
? getLayout
onLayout = (event) => {
const {x, y, width, height} = event.nativeEvent.layout;
do something with layout
}
…
renderItem = ({ item: loyaltyCard, index}) => (
<View onLayout={this.onLayout} />
)
? initialNumToRender maxToRenderPerBatch. .
initialNumToRender .
maxToRenderPerBatch
- lazyLoad onEndReached onEndReachedThreshold .
.
?
removeClippedSubviews — true
.
getItemLayout.
. ReactNative