usePagination.ts 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import { computed, ref } from "vue";
  2. export enum PaginationType {
  3. DEFAULT = 0,
  4. CONCAT = 1,
  5. }
  6. export const DEFAULT_PAGE_SIZE = 10;
  7. export const usePagination = <T>(
  8. handler: (params: { pageNum: number; pageSize: number }) => any,
  9. type = PaginationType.DEFAULT,
  10. size = DEFAULT_PAGE_SIZE
  11. ) => {
  12. const pageNum = ref(1);
  13. const total = ref(0);
  14. const loading = ref(false);
  15. const list = ref<T[]>([]);
  16. const noData = computed(() => !total.value && !loading.value);
  17. const noMore = computed(() => size * pageNum.value < total.value);
  18. const getList = async () => {
  19. try {
  20. loading.value = true;
  21. const data = await handler({
  22. pageNum: pageNum.value,
  23. pageSize: size,
  24. });
  25. total.value = data.total;
  26. if (type === PaginationType.DEFAULT) {
  27. list.value = data.records;
  28. } else {
  29. list.value =
  30. pageNum.value > 1 ? list.value.concat(data.records) : data.records;
  31. }
  32. } finally {
  33. loading.value = false;
  34. }
  35. };
  36. const resetParams = () => {
  37. pageNum.value = 1;
  38. total.value = 0;
  39. list.value = [];
  40. };
  41. return {
  42. pageNum,
  43. loading,
  44. list,
  45. total,
  46. noData,
  47. noMore,
  48. getList,
  49. resetParams,
  50. };
  51. };