# Виртуальный список

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

Виртуальный список
<template>
  <div class="demo-col">
    <p class="demo-note">Режим фиксированной высоты: itemHeight + overscan — из тысячи элементов рендерится только видимая область</p>
    <LhVirtualList :data="items" :height="240" :item-height="36" :overscan="6">
      <template #default="{ item, index }">
        <div class="vl-item" :style="{ background: index % 2 ? 'transparent' : 'var(--lh-fill-color, #f6f1ea)' }">
          {{ index + 1 }}. {{ item }}
        </div>
      </template>
    </LhVirtualList>
    <p class="demo-note">Режим динамической высоты: itemSize возвращает высоту каждого элемента</p>
    <LhVirtualList :data="items" :height="200" :item-size="sizeOf">
      <template #default="{ item, index }">
        <div class="vl-item" :style="{ height: sizeOf(index) + 'px' }">
          {{ index + 1 }}. {{ item }} (высота {{ sizeOf(index) }}px)
        </div>
      </template>
    </LhVirtualList>
  </div>
</template>

<script>
export default {
  data: () => ({
    items: Array.from({ length: 1000 }, (_, i) => `Картина ${i + 1}`),
  }),
  methods: {
    sizeOf(index) {
      return 28 + (index % 5) * 14
    },
  },
}
</script>

# Props

Проп Описание Тип По умолчанию
data Источник данных (за рендеринг элементов отвечает слот default) any[] —
height Высота контейнера (число — px) number \| string —
itemHeight Высота элемента в режиме фиксированной высоты (одно из двух вместе с itemSize; если задан itemSize, используется динамическая высота) number —
itemSize Режим динамической высоты: вызывающая сторона возвращает высоту каждого элемента (index: number) => number —
overscan Количество элементов overscan number —
sx Компактная раскладка через sx — —

# Slots

Слот по умолчанию (областные параметры: item — элемент данных, index — индекс): рендеринг элемента списка.

Совет

Класс .vl-item в демо — лишь пример стиля, сама библиотека его не предоставляет.

Copyright © 2024-2026 FengMo WenXue