scroll.vue 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. <script setup lang="ts">
  2. // uniapp 页面生命周期
  3. import { onPullDownRefresh, onReachBottom } from '@dcloudio/uni-app'
  4. import { useScroll } from '@/hooks/useScroll'
  5. definePage({
  6. style: {
  7. navigationBarTitleText: '下拉刷新和下拉加载更多',
  8. enablePullDownRefresh: true,
  9. onReachBottomDistance: 100,
  10. },
  11. })
  12. // 模拟异步获取数据的函数
  13. function mockFetchData(page: number, pageSize: number): Promise<{ id: number, name: string }[]> {
  14. return new Promise((resolve) => {
  15. setTimeout(() => {
  16. if (page > 5) {
  17. // 模拟没有更多数据
  18. resolve([])
  19. return
  20. }
  21. const data = Array.from({ length: pageSize }, (_, i) => ({
  22. id: (page - 1) * pageSize + i + 1,
  23. name: `item ${(page - 1) * pageSize + i + 1}`,
  24. }))
  25. resolve(data)
  26. }, 1000)
  27. })
  28. }
  29. const { list, loading, finished, error, refresh, loadMore } = useScroll({
  30. fetchData: mockFetchData,
  31. pageSize: 10,
  32. })
  33. onPullDownRefresh(async () => {
  34. console.log('onPullDownRefresh')
  35. console.log('onPullDownRefresh')
  36. console.log('onPullDownRefresh')
  37. await refresh()
  38. uni.stopPullDownRefresh()
  39. })
  40. onReachBottom(() => {
  41. loadMore()
  42. })
  43. </script>
  44. <template>
  45. <view class="h-screen p-4">
  46. <view v-if="error" class="text-center text-red-500">
  47. 加载失败,请重试
  48. </view>
  49. <view v-else>
  50. <view
  51. v-for="item in list"
  52. :key="item.id"
  53. class="my-2 h-20 flex items-center justify-center rounded bg-gray-100"
  54. >
  55. {{ item.name }}
  56. </view>
  57. <view v-if="loading" class="py-4 text-center text-gray-500">
  58. 加载中...
  59. </view>
  60. <view v-if="finished" class="py-4 text-center text-gray-500">
  61. 没有更多了
  62. </view>
  63. </view>
  64. </view>
  65. </template>