useInfiniteScroll
Infinite scrolling of the element.
Demo
1
2
3
4
5
6
Usage
<script setup lang="ts">
import { ref, toRefs } from 'vue'
import { useInfiniteScroll } from '@vueuse/core'
const el = ref<HTMLElement>(null)
const data = ref([1,2,3,4,5,6])
useInfiniteScroll(
el,
() => {
// load more
data.value.push(...moreData)
},
{ distance: 10 }
)
</script>
<template>
<div ref="el">
<div v-for="item in data">
{{ item }}
</div>
</div>
</template>
<script setup lang="ts">
import { ref, toRefs } from 'vue'
import { useInfiniteScroll } from '@vueuse/core'
const el = ref<HTMLElement>(null)
const data = ref([1,2,3,4,5,6])
useInfiniteScroll(
el,
() => {
// load more
data.value.push(...moreData)
},
{ distance: 10 }
)
</script>
<template>
<div ref="el">
<div v-for="item in data">
{{ item }}
</div>
</div>
</template>
Directive Usage
This function also provides a directive version via the
@vueuse/components
package. Learn more about the usage.
<script setup lang="ts">
import { ref } from 'vue'
import { vInfiniteScroll } from '@vueuse/components'
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))
}
</script>
<template>
<div v-infinite-scroll="onLoadMore">
<div v-for="item in data" :key="item">
{{ item }}
</div>
</div>
<!-- with options -->
<div v-infinite-scroll="[onLoadMore, { 'distance' : 10 }]">
<div v-for="item in data" :key="item">
{{ item }}
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { vInfiniteScroll } from '@vueuse/components'
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))
}
</script>
<template>
<div v-infinite-scroll="onLoadMore">
<div v-for="item in data" :key="item">
{{ item }}
</div>
</div>
<!-- with options -->
<div v-infinite-scroll="[onLoadMore, { 'distance' : 10 }]">
<div v-for="item in data" :key="item">
{{ item }}
</div>
</div>
</template>
Type Declarations
export interface UseInfiniteScrollOptions extends UseScrollOptions {
/**
* The minimum distance between the bottom of the element and the bottom of the viewport
*
* @default 0
*/
distance?: number
/**
* The direction in which to listen the scroll.
*
* @default 'bottom'
*/
direction?: "top" | "bottom" | "left" | "right"
/**
* Whether to preserve the current scroll position when loading more items.
*
* @default false
*/
preserveScrollPosition?: boolean
}
/**
* Reactive infinite scroll.
*
* @see https://vueuse.org/useInfiniteScroll
*/
export declare function useInfiniteScroll(
element: MaybeRef<
HTMLElement | SVGElement | Window | Document | null | undefined
>,
onLoadMore: (
state: UnwrapNestedRefs<ReturnType<typeof useScroll>>
) => void | Promise<void>,
options?: UseInfiniteScrollOptions
): void
export interface UseInfiniteScrollOptions extends UseScrollOptions {
/**
* The minimum distance between the bottom of the element and the bottom of the viewport
*
* @default 0
*/
distance?: number
/**
* The direction in which to listen the scroll.
*
* @default 'bottom'
*/
direction?: "top" | "bottom" | "left" | "right"
/**
* Whether to preserve the current scroll position when loading more items.
*
* @default false
*/
preserveScrollPosition?: boolean
}
/**
* Reactive infinite scroll.
*
* @see https://vueuse.org/useInfiniteScroll
*/
export declare function useInfiniteScroll(
element: MaybeRef<
HTMLElement | SVGElement | Window | Document | null | undefined
>,
onLoadMore: (
state: UnwrapNestedRefs<ReturnType<typeof useScroll>>
) => void | Promise<void>,
options?: UseInfiniteScrollOptions
): void
Source
Contributors
Changelog
v8.9.4
on 7/17/2022v8.6.0
on 5/31/2022v8.1.0
on 3/16/2022v8.0.0-beta.1
on 3/5/2022v7.6.0
on 2/8/2022