mirror of
https://github.com/ialley-workshop-open/uni-halo.git
synced 2026-07-27 04:20:43 +08:00
3945ee611d
- 删除大量废弃的旧代码、依赖和配置文件 - 新增基础项目配置、工具函数、页面模板和请求库 - 重构目录结构,统一项目规范 - 添加commitlint、husky等代码规范工具
75 lines
1.3 KiB
TypeScript
75 lines
1.3 KiB
TypeScript
import type { Ref } from 'vue'
|
|
import { onMounted, ref } from 'vue'
|
|
|
|
interface UseScrollOptions<T> {
|
|
fetchData: (page: number, pageSize: number) => Promise<T[]>
|
|
pageSize?: number
|
|
}
|
|
|
|
interface UseScrollReturn<T> {
|
|
list: Ref<T[]>
|
|
loading: Ref<boolean>
|
|
finished: Ref<boolean>
|
|
error: Ref<any>
|
|
refresh: () => Promise<void>
|
|
loadMore: () => Promise<void>
|
|
}
|
|
|
|
export function useScroll<T>({
|
|
fetchData,
|
|
pageSize = 10,
|
|
}: UseScrollOptions<T>): UseScrollReturn<T> {
|
|
const list = ref<T[]>([]) as Ref<T[]>
|
|
const loading = ref(false)
|
|
const finished = ref(false)
|
|
const error = ref<any>(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,
|
|
}
|
|
}
|