useInfiniteScroll 的功能宛如開啟了一個無限延伸的領域,每當我往下滑動,都能看見更多內容。然而,就在我沉浸其中時,阿狗兄突然來訪,直言我學習不夠認真。
「你每次都只學點皮毛,這樣怎麼能真正掌握 VueUse?」他的話直截了當,讓我不禁開始反思。儘管我一直在學習,但阿狗兄或許說得有理—我的專注力時常分散,總是急於瀏覽所有內容,卻忽略了深入研究的重要性。
useInfiniteScroll
是用來實現無限滾動功能的 VueUse 函式。本文將詳細介紹其功能、參數和使用場景,並提供實用範例。
useInfiniteScroll
APIuseInfiniteScroll
監聽指定元素的滾動事件,並在滾動達到特定條件時觸發加載更多內容的回調函式。它支援多方向滾動監聽,並提供豐富的參數,如滾動距離的閾值和觸發間隔。適用於實現無限加載或虛擬滾動列表的場景。
名稱 | 類型 | 說明 |
---|---|---|
element |
MaybeRefOrGetter<InfiniteScrollElement> |
要監聽滾動事件的元素。可以是響應式引用或 getter 函式。 |
onLoadMore |
(state: UnwrapNestedRefs<ReturnType<typeof useScroll>>) => Awaitable<void> |
當滾動到達指定條件時觸發的回調函式。 |
options |
UseInfiniteScrollOptions<T> |
可選參數,用於設定無限滾動的行為。 |
名稱 | 類型 | 默認值 | 說明 |
---|---|---|---|
distance |
number |
0 |
元素底部與視口底部之間的最小距離,用於觸發加載。 |
direction |
'top' | 'bottom' | 'left' | 'right' |
'bottom' |
監聽滾動的方向。 |
interval |
number |
100 |
兩次加載更多之間的時間間隔(毫秒)。 |
canLoadMore |
(el: T) => boolean |
- | 判斷是否可以加載更多內容的函式。 |
useInfiniteScroll
返回一個包含以下屬性的對象:
名稱 | 類型 | 說明 |
---|---|---|
isLoading |
ComputedRef<boolean> |
表示當前是否正在加載更多內容的計算屬性。 |
reset |
() => void |
重置無限滾動狀態的函式。 |
<template>
<div ref="container" style="height: 300px; overflow-y: auto;">
<div v-for="item in items" :key="item">{{ item }}</div>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { useInfiniteScroll } from '@vueuse/core'
const container = ref(null)
const items = ref(Array.from({ length: 20 }, (_, i) => i + 1))
const { isLoading } = useInfiniteScroll(
container,
async () => {
// 模擬異步加載
await new Promise(resolve => setTimeout(resolve, 1000))
const newItems = Array.from({ length: 20 }, (_, i) => items.value.length + i + 1)
items.value.push(...newItems)
},
{ distance: 10 }
)
</script>
<template>
<div ref="container" style="height: 300px; overflow-y: auto;">
<div v-for="item in items" :key="item">{{ item }}</div>
<div v-if="isLoading && canLoadMore">加載中...</div>
</div>
</template>
<script setup>
import { ref, computed } from 'vue'
import { useInfiniteScroll } from '@vueuse/core'
const container = ref(null)
const items = ref(Array.from({ length: 20 }, (_, i) => i + 1))
const maxItems = 100
const canLoadMore = computed(
()=>items.value.length < maxItems
)
const { isLoading } = useInfiniteScroll(
container,
async () => {
await new Promise(resolve => setTimeout(resolve, 1000))
const newItems = Array.from({ length: 20 }, (_, i) => items.value.length + i + 1)
items.value.push(...newItems.slice(0, maxItems - items.value.length))
},
{
distance: 10,
canLoadMore
}
)
</script>
useInfiniteScroll
的使用場景useInfiniteScroll
實現分批加載,提高頁面性能。useInfiniteScroll
useInfiniteScroll
封裝了複雜的滾動監聽和加載邏輯,簡化了開發流程。useInfiniteScroll
簡化了 Vue 應用中無限滾動功能的實現。透過提供直觀的 API 和豐富的設定參數,useInfiniteScroll
能夠處理從簡單的列表載入到複雜的虛擬滾動等各種場景。
合理運用useInfiniteScroll
,可顯著減少編寫滾動監聽和資料載入邏輯的工作量。提升了應用的效能和程式碼的可讀性與可維護性。
這兩天颱風天大家注意安全喔~~今天就先到這邊,如果有看到錯誤再麻煩留言讓我知道喔