Вопрос проверяет понимание техники виртуального скролла для оптимизации производительности при отображении больших списков данных.
Виртуальный скролл (или windowing) — это техника рендеринга, при которой в DOM присутствуют только те элементы списка, которые видны пользователю в данный момент. Остальные элементы заменяются пустыми блоками-заполнителями, сохраняющими общую высоту скролла. Это позволяет работать со списками из десятков тысяч элементов без потери производительности.
Основная идея заключается в том, чтобы отслеживать позицию скролла и вычислять, какие элементы должны быть видны. Для этого используется контейнер с фиксированной высотой и overflow: auto. Внутри него находится прокручиваемый блок с общей высотой, равной высоте всех элементов. Видимые элементы рендерятся абсолютно позиционированными внутри этого блока.
import { useRef, useState, useCallback } from 'react';
const ITEM_HEIGHT = 50;
const OVERSCAN = 3;
function VirtualList({ items }) {
const containerRef = useRef(null);
const [scrollTop, setScrollTop] = useState(0);
const handleScroll = useCallback(() => {
setScrollTop(containerRef.current.scrollTop);
}, []);
const totalHeight = items.length * ITEM_HEIGHT;
const startIndex = Math.max(0, Math.floor(scrollTop / ITEM_HEIGHT) - OVERSCAN);
const endIndex = Math.min(items.length, Math.ceil((scrollTop + containerRef.current?.clientHeight) / ITEM_HEIGHT) + OVERSCAN);
const visibleItems = items.slice(startIndex, endIndex);
return (
<div ref={containerRef} onScroll={handleScroll} style={{ height: '400px', overflow: 'auto' }}>
<div style={{ height: totalHeight, position: 'relative' }}>
{visibleItems.map((item, index) => (
<div key={item.id} style={{
position: 'absolute',
top: (startIndex + index) * ITEM_HEIGHT,
height: ITEM_HEIGHT,
width: '100%'
}}>
{item.text}
</div>
))}
</div>
</div>
);
}Вывод: виртуальный скролл стоит применять, когда нужно отобразить более 1000 элементов в списке, чтобы избежать зависаний интерфейса и обеспечить плавную прокрутку.
Frontend developer
Ментор по Frontend
Полное сопровождение до оффера — без дорогих курсов, с оплатой после трудоустройства
Записаться на консультацию