仮想スクローラー

VirtualScrollerは、大量のデータを効率的にレンダリングするための高性能なアプローチです。


import VirtualScroller from 'primevue/virtualscroller';

VirtualScrollerは、表示するデータとしてitems、アイテムの寸法を表すitemSize、およびコンポーネントに必要なitemテンプレートを必要とします。さらに、表示するアイテムの総数に基づいた初期配列が必要です。ビューポートのサイズは、scrollWidthscrollHeightプロパティを直接使用するか、CSSのwidthheightスタイルを使用して設定します。


<VirtualScroller :items="items" :itemSize="50" class="border border-surface-200 dark:border-surface-700 rounded" style="width: 200px; height: 200px">
    <template v-slot:item="{ item, options }">
        <div :class="['flex items-center p-2', { 'bg-surface-100 dark:bg-surface-700': options.odd }]" style="height: 50px">{{ item }}</div>
    </template>
</VirtualScroller>

orientationhorizontalに設定すると、水平スクロールが可能になります。この場合、itemSizeはアイテムの幅を表す必要があります。


<VirtualScroller :items="items" :itemSize="50" orientation="horizontal" class="border border-surface-200 dark:border-surface-700 rounded" style="width: 200px; height: 200px" :pt="{ content: 'flex flex-row' }">
    <template v-slot:item="{ item, options }">
        <div :class="['flex items-center p-2', { 'bg-surface-100 dark:bg-surface-700': options.odd }]" style="width: 50px; writing-mode: vertical-lr;">{{ item }}</div>
    </template>
</VirtualScroller>

orientationbothに設定すると、垂直および水平スクロールを有効にできます。このモードでは、itemSizeは、最初の値がアイテムの高さ、2番目の値が幅である配列である必要があります。


<VirtualScroller :items="items" :itemSize="[50, 100]" orientation="both" class="border border-surface-200 dark:border-surface-700 rounded" style="width: 200px; height: 200px">
    <template v-slot:item="{ item, options }">
        <div :class="['flex items-center p-2', { 'bg-surface-100 dark:bg-surface-700': options.odd }]" style="height: 50px">
            <template v-for="(el, index) of item" :key="index">
                <div style="width: 100px">{{ el }}</div>
            </template>
        </div>
    </template>
</VirtualScroller>

delayプロパティは、レンダリングの最適化のためにスクロール中にミリ秒単位で待機するしきい値を追加します。

遅延なし
150ms
500ms

<VirtualScroller :items="items" :itemSize="50" class="border border-surface-200 dark:border-surface-700 rounded" style="width: 200px; height: 200px">
    <template v-slot:item="{ item, options }">
        <div :class="['flex items-center p-2', { 'bg-surface-100 dark:bg-surface-700': options.odd }]" style="height: 50px">{{ item }}</div>
    </template>
</VirtualScroller>

<VirtualScroller :items="items" :itemSize="50" :delay="150" class="border border-surface-200 dark:border-surface-700 rounded" style="width: 200px; height: 200px">
    <template v-slot:item="{ item, options }">
        <div :class="['flex items-center p-2', { 'bg-surface-100 dark:bg-surface-700': options.odd }]" style="height: 50px">{{ item }}</div>
    </template>
</VirtualScroller>

<VirtualScroller :items="items" :itemSize="50" :delay="500" class="border border-surface-200 dark:border-surface-700 rounded" style="width: 200px; height: 200px">
    <template v-slot:item="{ item, options }">
        <div :class="['flex items-center p-2', { 'bg-surface-100 dark:bg-surface-700': options.odd }]" style="height: 50px">{{ item }}</div>
    </template>
</VirtualScroller>

ビジー状態は、showLoaderプロパティを追加することで有効になり、デフォルトではモーダルでUIをブロックします。あるいは、loaderテンプレートを使用して、スケルトンなどを使用してアイテムをカスタマイズできます。

モーダル
スケルトン

<VirtualScroller :items="items" :itemSize="50" showLoader :delay="250" class="border border-surface-200 dark:border-surface-700 rounded" style="width: 200px; height: 200px">
    <template v-slot:item="{ item, options }">
        <div :class="['flex items-center p-2', { 'bg-surface-100 dark:bg-surface-700': options.odd }]" style="height: 50px">{{ item }}</div>
    </template>
</VirtualScroller>

<VirtualScroller :items="items" :itemSize="50" showLoader :delay="250" class="border border-surface-200 dark:border-surface-700 rounded" style="width: 200px; height: 200px">
    <template v-slot:item="{ item, options }">
        <div :class="['flex items-center p-2', { 'bg-surface-100 dark:bg-surface-700': options.odd }]" style="height: 50px">{{ item }}</div>
    </template>
    <template v-slot:loader="{ options }">
        <div :class="['flex items-center p-2', { 'bg-surface-100 dark:bg-surface-700': options.odd }]" style="height: 50px">
            <Skeleton :width="options.even ? '60%' : '50%'" height="1.3rem" />
        </div>
    </template>
</VirtualScroller>

遅延読み込みモードは、大規模なデータセットを処理する場合に便利です。データ全体を読み込む代わりに、必要に応じて少量のデータがオンデマンドで読み込まれます。遅延読み込みを実装するには、lazyプロパティを有効にし、onLazyLoadコールバックを実装してデータを取得します。


<VirtualScroller :items="lazyItems" :itemSize="50" showLoader :delay="250" :loading="lazyLoading" lazy @lazy-load="onLazyLoad" class="border border-surface-200 dark:border-surface-700 rounded" style="width: 200px; height: 200px">
    <template v-slot:item="{ item, options }">
        <div :class="['flex items-center p-2', { 'bg-surface-100 dark:bg-surface-700': options.odd }]" style="height: 50px">{{ item }}</div>
    </template>
</VirtualScroller>

スクリーンリーダー

VirtualScrollerは特定の役割を強制的に適用しませんが、有効な属性はすべてコンテナ要素に渡されるため、任意のariaロールと属性を使用できます。

キーボードサポート

このコンポーネントには、組み込みのインタラクティブ要素は含まれていません。