Hai semua,
Saat mengerjakan beberapa peningkatan kinerja, saya menemukan bahwa rowHasChanged
tidak dipanggil dalam daftar kami. Daftar ini adalah daftar gulir tak terbatas, artinya ketika Anda mencapai akhir, itu akan mengambil lebih banyak item untuk ditampilkan dan kemudian membuangnya ke dalam daftar.
Sepertinya semua entri dalam daftar diperbarui setiap kali kami mengubah konten DataSource. Kami memiliki shouldComponentUpdate
di tempat untuk semua baris, tetapi dari cara saya memahami rowHasChanged
, baris ini tidak perlu dirender lagi.
Saya membuat contoh sederhana yang menunjukkan bagaimana kami menambahkan item ke daftar: https://Gist.github.com/janmonschke/c9c84b6050683da0c64f
Yang pada dasarnya kami lakukan adalah:
constructor() {
// (...)
this.ds = new ListView.DataSource({rowHasChanged: (r1, r2) => {
console.log('rowHasChanged');
return r1 !== r2;
}});
// (...)
}
onEndReached = () => {
// append data to the end
setData = [...setData, ...genRandomSet()];
this.setState({
dataSource: this.ds.cloneWithRows(setData)
});
console.log('onEndReached');
};
render() {
return (
<ListView
dataSource={this.state.dataSource}
renderRow={this.renderRow}
onEndReached={this.onEndReached}
/>
);
}
Tapi rowHasChanged
tidak pernah dicatat.
Apakah saya menggunakannya dengan cara yang salah? Apakah ada cara yang lebih baik untuk menambahkan ke ListView?
Perilaku yang sama di 0.18.0
dan 0.19.0
Hai janmonschke, terima kasih telah melaporkan masalah ini!
React Native, seperti yang mungkin pernah Anda dengar, menjadi sangat populer dan sebenarnya kami sedikit kewalahan dengan aktivitas di sekitarnya. Ada terlalu banyak masalah untuk kita kelola dengan baik.
react-native
atau untuk interaksi waktu nyata lainnya, tanyakan di Discord di # saluran asli-reaksi.Oke, temukan solusinya di: http://stackoverflow.com/a/33871118.
Rupanya penting untuk mengkloning dari contoh DataSource yang benar ;)
Jadi kode dari intinya seharusnya:
setData = [...setData, ...genRandomSet()];
this.setState({
dataSource: this.state.dataSource.cloneWithRows(setData)
});
Ini sepertinya kesalahan yang dengan mudah menyelinap ke basis kode Anda. Saya ingin tahu apakah penggunaan DataSource
yang benar harus lebih ditekankan dalam dokumentasi.
Terima kasih @janmonschke! Saya setuju, saya memiliki banyak tampilan yang terus-menerus dirender ulang dan saya tidak tahu mengapa itu terjadi dan mengapa fungsi rowHasChanged
tidak pernah dipanggil. 👊.
Komentar yang paling membantu
Oke, temukan solusinya di: http://stackoverflow.com/a/33871118.
Rupanya penting untuk mengkloning dari contoh DataSource yang benar ;)
Jadi kode dari intinya seharusnya:
Ini sepertinya kesalahan yang dengan mudah menyelinap ke basis kode Anda. Saya ingin tahu apakah penggunaan
DataSource
yang benar harus lebih ditekankan dalam dokumentasi.