Це поєднання нескінченної таблиці та нескінченного сценарію прокрутки. Найкраща абстракція, яку я знайшов для цього, полягає в наступному:
Огляд
Складіть <List>
компонент, який займає масив усіх дітей. Оскільки ми не надаємо їх, насправді дешево просто виділити їх та відкинути. Якщо виділення 10k занадто великі, ви можете замість цього передати функцію, яка займає діапазон і повертати елементи.
<List>
{thousandelements.map(function() { return <Element /> })}
</List>
Ваша List
компонент слідкує за тим, яке положення прокрутки, і відображає лише дітей, які переглядаються. Він додає великий порожній div на початку, щоб підробити попередні елементи, які не відображаються.
Тепер, цікава частина полягає в тому, що після того, як Element
компонент виведений, ви вимірюєте його висоту і зберігаєте його у своєму List
. Це дозволяє вам обчислити висоту розпірки і знати, скільки елементів повинно відображатися у вигляді.
Зображення
Ви говорите, що коли завантажується зображення, вони змушують все "стрибати" вниз. Рішення для цього полягає у встановленні розмірів зображення у вашому тезі img:<img src="..." width="100" height="58" />
. Таким чином, браузеру не потрібно чекати його завантаження, перш ніж знати, якого розміру він буде відображатися. Для цього потрібна певна інфраструктура, але вона справді того варта.
Якщо ви не можете знати розмір заздалегідь, додайте onload
слухачів до свого зображення, а коли він завантажується, виміряйте його розмір та оновіть збережену висоту рядка та компенсуйте положення прокрутки.
Стрибки на випадковий елемент
Якщо вам потрібно перейти на випадковий елемент у списку, для цього знадобиться певна хитрість із положенням прокрутки, оскільки ви не знаєте розмір елементів між ними. Я пропоную вам зробити середню висоту елементів, яку ви вже обчислили, і перейти до положення прокрутки останньої відомої висоти + (кількість елементів * середнє).
Оскільки це не точно, це спричинить проблеми, коли ви повернетесь до останнього відомого хорошого становища. Коли конфлікт трапляється, просто змініть положення прокрутки, щоб виправити його. Це трохи перемістить смугу прокрутки, але не повинно сильно впливати на нього.
Особливості реагування
Ви хочете надати ключ до всіх виведених елементів, щоб вони підтримувались через візуалізацію. Є дві стратегії: (1) мають лише n клавіш (0, 1, 2, ... n), де n - максимальна кількість елементів, які можна відобразити та використовувати їх положення модуля n. (2) мають різний ключ на елемент. Якщо всі елементи мають подібну структуру, добре використовувати (1) повторне використання їх DOM-вузлів. Якщо вони не використовуються (2).
Я мав би лише два фрагменти стану React: індекс першого елемента та кількість елементів, що відображаються. Поточне положення прокрутки та висота всіх елементів будуть безпосередньо прикріплені до this
. Під час використання setState
ви фактично робите рендерінг, який має відбуватися лише тоді, коли змінюється діапазон.
Ось приклад нескінченного списку з використанням деяких методів, які я описую у цій відповіді. Це буде якась робота, але React, безумовно, є хорошим способом реалізації нескінченного списку :)