Ini adalah campuran dari tabel tak terbatas dan skenario gulir tak terbatas. Abstraksi terbaik yang saya temukan untuk ini adalah sebagai berikut:
Gambaran
Buat <List>komponen yang mengambil array dari semua anak. Karena kami tidak merendernya, sangat murah untuk mengalokasikannya dan membuangnya. Jika alokasi 10k terlalu besar, Anda dapat meneruskan fungsi yang mengambil rentang dan mengembalikan elemen.
<List>
{thousandelements.map(function() { return <Element /> })}
</List>
ListKomponen Anda melacak posisi scroll dan hanya menampilkan anak-anak yang terlihat. Ini menambahkan div kosong besar di awal untuk memalsukan item sebelumnya yang tidak dirender.
Sekarang, bagian yang menarik adalah setelah sebuah Elementkomponen dibuat, Anda mengukur tingginya dan menyimpannya di file List. Ini memungkinkan Anda menghitung ketinggian spacer dan mengetahui berapa banyak elemen yang harus ditampilkan dalam tampilan.
Gambar
Anda mengatakan bahwa saat gambar dimuat, semuanya "melompat" ke bawah. Solusi untuk ini adalah untuk mengatur dimensi gambar di tag img Anda: <img src="..." width="100" height="58" />. Dengan cara ini browser tidak perlu menunggu untuk mendownloadnya sebelum mengetahui ukuran apa yang akan ditampilkan. Ini membutuhkan beberapa infrastruktur tetapi itu sangat berharga.
Jika Anda tidak dapat mengetahui ukurannya terlebih dahulu, tambahkan onloadpendengar ke gambar Anda dan saat dimuat, ukur dimensi yang ditampilkan dan perbarui tinggi baris yang disimpan dan kompensasi posisi gulir.
Melompat di elemen acak
Jika Anda perlu melompat ke elemen acak dalam daftar itu akan membutuhkan beberapa trik dengan posisi gulir karena Anda tidak tahu ukuran elemen di antaranya. Apa yang saya sarankan untuk Anda lakukan adalah untuk meratakan ketinggian elemen yang telah Anda hitung dan melompat ke posisi gulir dari ketinggian yang diketahui terakhir + (jumlah elemen * rata-rata).
Karena ini tidak tepat, ini akan menyebabkan masalah ketika Anda mencapai kembali ke posisi terakhir yang diketahui. Saat konflik terjadi, cukup ubah posisi gulir untuk memperbaikinya. Ini akan memindahkan bilah gulir sedikit tetapi seharusnya tidak terlalu mempengaruhi dia.
React Specifics
Anda ingin memberikan kunci ke semua elemen yang dirender agar dipertahankan di seluruh render. Ada dua strategi: (1) hanya memiliki n kunci (0, 1, 2, ... n) di mana n adalah jumlah maksimum elemen yang dapat Anda tampilkan dan gunakan posisinya modulo n. (2) memiliki kunci yang berbeda per elemen. Jika semua elemen memiliki struktur yang serupa, sebaiknya gunakan (1) untuk menggunakan kembali node DOM-nya. Jika tidak, gunakan (2).
Saya hanya akan memiliki dua bagian dari status React: indeks dari elemen pertama dan jumlah elemen yang ditampilkan. Posisi gulir saat ini dan ketinggian semua elemen akan langsung dilampirkan this. Saat menggunakan setStateAnda sebenarnya melakukan perenderan yang seharusnya hanya terjadi saat rentang berubah.
Berikut adalah contoh daftar tak terbatas menggunakan beberapa teknik yang saya jelaskan dalam jawaban ini. Ini akan menjadi beberapa pekerjaan tetapi React jelas merupakan cara yang baik untuk mengimplementasikan daftar tak terbatas :)