Sobes.tech
Назад к вопросам
Middle
3

Как работает виртуализация списка? Как это реализовано технически через JavaScript?

Компании, где спрашивали
Mayflower

Ответ от нейросети

sobes.tech AI

Виртуализация списка — это техника оптимизации отображения длинных списков в интерфейсе, при которой в DOM рендерятся только видимые пользователю элементы, а остальные — нет. Это значительно снижает нагрузку на браузер и повышает производительность.

Технически в JavaScript это реализуется так:

  1. Отслеживается размер контейнера и высота одного элемента списка.
  2. Вычисляется, сколько элементов помещается в видимую область.
  3. В DOM рендерятся только эти элементы плюс небольшой запас сверху и снизу для плавности прокрутки.
  4. При прокрутке обновляется набор отображаемых элементов, а контейнеру задаётся общая высота, чтобы скроллбар соответствовал полному списку.

Пример упрощённой реализации на React:

function VirtualList({ items, itemHeight, height }) {
  const [scrollTop, setScrollTop] = React.useState(0);
  const totalHeight = items.length * itemHeight;
  const startIndex = Math.floor(scrollTop / itemHeight);
  const visibleCount = Math.ceil(height / itemHeight);
  const visibleItems = items.slice(startIndex, startIndex + visibleCount);

  const offsetY = startIndex * itemHeight;

  return (
    <div style={{ height, overflowY: 'auto' }} onScroll={e => setScrollTop(e.currentTarget.scrollTop)}>
      <div style={{ height: totalHeight, position: 'relative' }}>
        <div style={{ transform: `translateY(${offsetY}px)`, position: 'absolute', top: 0, left: 0, right: 0 }}>
          {visibleItems.map(item => (
            <div key={item.id} style={{ height: itemHeight }}>
              {item.content}
            </div>
          ))}
        </div>
      </div>
    </div>
  );
}

Таким образом, браузер работает только с небольшим числом элементов, что улучшает производительность при работе с большими списками.