useInfiniteScroll

useInfiniteScroll

要素の無限スクロール。

使用法

<script setup lang="ts">
import { useInfiniteScroll } from '@vueuse/core'
import { ref, useTemplateRef } from 'vue'

const el = useTemplateRef<HTMLElement>('el')
const data = ref([1, 2, 3, 4, 5, 6])

const { reset } = useInfiniteScroll(
  el,
  () => {
    // さらに読み込む
    data.value.push(...moreData)
  },
  {
    distance: 10,
    canLoadMore: () => {
      // これ以上読み込むコンテンツがないことを示すと、onLoadMoreのトリガーが停止します
      // if (noMoreContent) return false
      return true // デモ用
    },
  }
)

function resetList() {
  data.value = []
  reset()
}
</script>

<template>
  <div ref="el">
    <div v-for="item in data">
      {{ item }}
    </div>
  </div>
  <button @click="resetList()">
    リセット
  </button>
</template>

方向

異なるスクロール方向には異なるCSSスタイル設定が必要です:

方向必要なCSS設定
bottom (デフォルト)特別な設定は不要
topdisplay: flex;
flex-direction: column-reverse;
leftdisplay: flex;
flex-direction: row-reverse;
rightdisplay: flex;

::: warning canLoadMoreを使用して、これ以上読み込むコンテンツがないことを示してください。そうしないと、onLoadMoreはコンテンツをさらに読み込むスペースがある限りトリガーされ続けます。 :::

ディレクティブの使用法

<script setup lang="ts">
import { vInfiniteScroll } from '@vueuse/components'
import { ref } from 'vue'

const data = ref([1, 2, 3, 4, 5, 6])

function onLoadMore() {
  const length = data.value.length + 1
  data.value.push(...Array.from({ length: 5 }, (_, i) => length + i))
}
function canLoadMore() {
  // これ以上読み込むコンテンツがないことを示すと、onLoadMoreのトリガーが停止します
  // if (noMoreContent) return false
  return true // デモ用
}
</script>

<template>
  <div v-infinite-scroll="onLoadMore">
    <div v-for="item in data" :key="item">
      {{ item }}
    </div>
  </div>

  <!-- オプション付き -->
  <div v-infinite-scroll="[onLoadMore, { distance: 10, canLoadMore }]">
    <div v-for="item in data" :key="item">
      {{ item }}
    </div>
  </div>
</template>