Ответ
Разработал кастомный виртуальный скролл для таблицы с 10k+ строк, который подгружает данные чанками и рендерит только видимые строки. Решение включало:
- Расчет видимого viewport на основе позиции скролла
- Ленивую подгрузку данных через IntersectionObserver
- Оптимизацию через memoization и useMemo
const VirtualScroll = ({ items, rowHeight }) => {
const [scrollTop, setScrollTop] = useState(0);
const viewportHeight = 500;
const startIndex = Math.floor(scrollTop / rowHeight);
const visibleCount = Math.ceil(viewportHeight / rowHeight);
const visibleItems = items.slice(startIndex, startIndex + visibleCount);
return (
<div onScroll={(e) => setScrollTop(e.target.scrollTop)}>
<div style={{ height: `${items.length * rowHeight}px` }}>
{visibleItems.map((item, i) => (
<Row key={i} item={item} />
))}
</div>
</div>
);
};
Это дало 60 FPS даже на слабых устройствах и сократило DOM-ноды с 10k до ~20.