From 3874a031a9eaba807ac431a45c2b7ef5626c8e99 Mon Sep 17 00:00:00 2001 From: liaochunxin Date: Sun, 28 Sep 2025 17:12:27 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E4=B8=8B=E6=8B=89?= =?UTF-8?q?=E5=88=B7=E6=96=B0=E5=92=8C=E4=B8=8B=E6=8B=89=E5=8A=A0=E8=BD=BD?= =?UTF-8?q?=E6=9B=B4=E5=A4=9A=20hooks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useScroll.ts | 74 +++++++++++++++++++++++++++++++++++++++ src/pages/about/about.vue | 10 ++++++ src/pages/demo/scroll.vue | 72 +++++++++++++++++++++++++++++++++++++ 3 files changed, 156 insertions(+) create mode 100644 src/hooks/useScroll.ts create mode 100644 src/pages/demo/scroll.vue diff --git a/src/hooks/useScroll.ts b/src/hooks/useScroll.ts new file mode 100644 index 0000000..1563223 --- /dev/null +++ b/src/hooks/useScroll.ts @@ -0,0 +1,74 @@ +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, + } +} diff --git a/src/pages/about/about.vue b/src/pages/about/about.vue index b25c6a1..ab82666 100644 --- a/src/pages/about/about.vue +++ b/src/pages/about/about.vue @@ -46,6 +46,11 @@ function gotoTabbar() { url: '/pages/index/index', }) } +function gotoScroll() { + uni.navigateTo({ + url: '/pages/demo/scroll', + }) +} // #region setTabbarBadge function setTabbarBadge() { tabbarStore.setTabbarItemBadge(1, 100) @@ -116,6 +121,11 @@ onShow(() => { + + +