Dalam artikel ini, saya tidak akan memberi tahu Anda bahwa Anda perlu menggunakan sesedikit mungkin konten untuk menampilkan atau menyimpan gambar. Tidak! Kami hanya akan berbicara tentang pengoptimalan daftar nyata dan tidak masalah apa yang perlu kami tampilkan, karena jika klien mengatakan saya ingin dan Anda tidak dapat berdebat dengannya.
Mari kita mulai dengan contoh paling sederhana. Katakanlah kita memiliki array.
const list = [{ _id: 567456, label: βCodingChipmunksβ }, ...]
Apa cara termudah untuk membuat daftar kecil? Memang benar untuk menggunakan metode .map
yang mengembalikan array baru dan kita dapat menampilkan seluruh daftar. Baiklah, mari kita lihat satu contoh:
render() {
return (
<View>
{list.map((item) => (
<View>
<Text>{item.label}</Text>
<View>))}
</View>
)
}
Benar? Tidak! Tidak pernah melakukannya!
- Pertama, Anda selalu perlu menentukan kunci untuk setiap item. Dan tolong jangan gunakan untuk elemen indeks ini dalam array. Di bawah ini saya akan memberi tahu Anda alasannya.
- Kedua, kodenya terlihat berantakan
- Ketiga, jangan gunakan fungsi anonim
Mengapa tidak melakukannya seperti ini:
renderItem = (item) => (
<View key={item._id}>
<Text>{item.label}</Text>
<View>
)
render() {
return (
<View>
{list.map((item) => this.renderItem(item)}
</View>)
}
atau lebih:
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>)
}
}
Apakah sekarang jauh lebih baik? Tidak juga.
. .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