import type { Ref } from 'vue' import { onMounted, ref } from 'vue' interface UseScrollOptions { fetchData: (page: number, pageSize: number) => Promise pageSize?: number } interface UseScrollReturn { list: Ref loading: Ref finished: Ref error: Ref refresh: () => Promise loadMore: () => Promise } export function useScroll({ fetchData, pageSize = 10, }: UseScrollOptions): UseScrollReturn { const list = ref([]) as Ref const loading = ref(false) const finished = ref(false) const error = ref(null) const page = ref(1) const loadData = async () => { if (loading.value || finished.value) return loading.value = true error.value = null try { const data = await fetchData(page.value, pageSize) if (data.length < pageSize) { finished.value = true } list.value.push(...data) page.value++ } catch (err) { error.value = err } finally { loading.value = false } } const refresh = async () => { page.value = 1 finished.value = false list.value = [] await loadData() } const loadMore = async () => { await loadData() } onMounted(() => { refresh() }) return { list, loading, finished, error, refresh, loadMore, } }