SimplePageListLoader.ts 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import { onPullDownRefresh, onReachBottom } from "@dcloudio/uni-app";
  2. import { ref, type Ref } from "vue";
  3. import type { ILoaderCommon, LoaderLoadType } from "./LoaderCommon";
  4. import { formatError } from "./ErrorDisplay";
  5. export interface ISimplePageListLoader<T, P> extends ILoaderCommon<P> {
  6. list: Ref<T[]>;
  7. page: Ref<number>;
  8. total: Ref<number>;
  9. }
  10. export function useSimplePageListLoader<T, P = any>(
  11. pageSize: number,
  12. loader: (page: number, pageSize: number, params?: P) => Promise<{ list: T[], total: number }>,
  13. showGlobalLoading = false,
  14. ) : ISimplePageListLoader<T, P>
  15. {
  16. const loadStatus = ref<LoaderLoadType>('loading');
  17. const loadError = ref('');
  18. const page = ref(0);
  19. const total = ref(0);
  20. const list = ref<T[]>([]) as Ref<T[]>;
  21. let lastParams: P | undefined;
  22. let loading = false;
  23. async function loadData(params?: P, refresh: boolean = false) {
  24. if (loading)
  25. return;
  26. if (params)
  27. lastParams = params;
  28. if (refresh) {
  29. page.value = 0;
  30. list.value = [];
  31. }
  32. page.value++;
  33. loadStatus.value = 'loading';
  34. loading = true;
  35. if (showGlobalLoading)
  36. uni.showLoading({ title: '加载中...' });
  37. try {
  38. const res = (await loader(page.value, pageSize, lastParams));
  39. list.value = list.value.concat(res.list as T[]);
  40. total.value = res.total;
  41. loadStatus.value = res.list.length > 0 ? 'finished' : 'nomore';
  42. loadError.value = '';
  43. loading = false;
  44. } catch(e) {
  45. console.log(e);
  46. loadError.value = formatError(e);
  47. loadStatus.value = 'error';
  48. loading = false;
  49. } finally {
  50. if (showGlobalLoading)
  51. uni.hideLoading();
  52. }
  53. }
  54. onPullDownRefresh(() => {
  55. loadData(lastParams, true).then(() => {
  56. uni.stopPullDownRefresh();
  57. }).catch(() => {
  58. uni.stopPullDownRefresh();
  59. });
  60. });
  61. onReachBottom(() => {
  62. if (loadStatus.value == 'nomore')
  63. return;
  64. loadData(lastParams, false);
  65. });
  66. return {
  67. list,
  68. total,
  69. page,
  70. loadStatus,
  71. loadError,
  72. loadData,
  73. }
  74. }