Skip to content

v-infinite-scroll

列表和信息流的无限滚动加载。

起始版本: 1.1.0

用法

基本

vue
<template>
  <div v-infinite-scroll="loadMore" class="scroll-container">
    <div v-for="item in items" :key="item.id">
      {{ item.name }}
    </div>
  </div>
</template>

<script setup>
import { ref } from 'vue'

const items = ref([...])

async function loadMore() {
  const newItems = await fetchMoreItems()
  items.value.push(...newItems)
}
</script>

API

选项类型默认值描述
handlerFunction-滚动到底部时的处理程序(必填)
distancenumber0触发加载的距离(像素)
disabledbooleanfalse禁用无限滚动
loadingbooleanfalse加载状态
throttlenumber200节流时间(毫秒)

Composable 用法

你也可以使用 useInfiniteScroll composable 来实现相同功能:

vue
<script setup>
import { ref, onMounted } from 'vue'
import { useInfiniteScroll } from 'directix'

const containerRef = ref(null)
const items = ref([])
const page = ref(1)

const { loading, finished, bind, load } = useInfiniteScroll({
  onLoad: async () => {
    const newItems = await fetchItems(page.value++)
    items.value.push(...newItems)
  },
  distance: 100
})

onMounted(() => bind(containerRef.value))
</script>

<template>
  <div ref="containerRef" class="scroll-container">
    <div v-for="item in items" :key="item.id">{{ item.name }}</div>
    <div v-if="loading">加载中...</div>
    <div v-if="finished">已加载全部</div>
  </div>
</template>

API

typescript
interface UseInfiniteScrollOptions {
  /** 加载更多的回调 */
  onLoad: () => void | Promise<void>
  /** 是否正在加载 */
  loading?: boolean | Ref<boolean>
  /** 是否已加载完毕 */
  finished?: boolean | Ref<boolean>
  /** 距底部的触发距离(像素) @default 0 */
  distance?: number | Ref<number>
  /** 是否在挂载时立即检查 @default true */
  immediate?: boolean
  /** 是否禁用 @default false */
  disabled?: boolean | Ref<boolean>
}

interface UseInfiniteScrollReturn {
  /** 是否正在加载 */
  loading: Readonly<Ref<boolean>>
  /** 是否已加载完毕 */
  finished: Readonly<Ref<boolean>>
  /** 手动触发加载 */
  load: () => Promise<void>
  /** 绑定无限滚动到元素 */
  bind: (element: HTMLElement) => () => void
  /** 停止观察 */
  stop: () => void
}

基于 MIT 许可发布