useFetchTable.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import { ref, reactive, watch, isRef } from 'vue';
  2. // options参数示例:
  3. // {
  4. // pageSize: 20,
  5. // params: ref({ a: 1, b: 2 }),
  6. // fetchDataHandle: () => {},
  7. // }
  8. export default function useFetchTable(apiFn, options = {}, immediately = true) {
  9. let pagination = reactive({
  10. pageNumber: 1,
  11. pageSize: options?.pageSize || 10,
  12. total: 0,
  13. });
  14. //tdesign的分页器组件的onChange方法,涵盖了页码的change和pageSize的change 两者的监听
  15. const onChange = (pageInfo) => {
  16. pagination.Size = pageInfo.pageSize;
  17. pagination.pageNumber = pageInfo.current;
  18. };
  19. const onPageSizeChange = (size) => {
  20. pagination.pageSize = size;
  21. pagination.pageNumber = 1;
  22. };
  23. const loading = ref(false);
  24. const tableData = ref([]);
  25. const fetchData = async () => {
  26. loading.value = true;
  27. try {
  28. let params = {
  29. pageNumber: pagination.pageNumber,
  30. pageSize: pagination.pageSize,
  31. ...((isRef(options.params) ? options.params?.value : options.params) ||
  32. {}),
  33. };
  34. let res = await apiFn(params);
  35. //下方代码 后续根据实际接口返回字段进行修改
  36. let list = Array.isArray(res.records) ? res.records : [];
  37. tableData.value = list;
  38. pagination.total = res.total;
  39. loading.value = false;
  40. options.fetchDataHandle && options.fetchDataHandle();
  41. } catch (err) {
  42. console.warn('分页请求错误:', err);
  43. }
  44. };
  45. const search = () => {
  46. if (pagination.pageNumber === 1) {
  47. fetchData();
  48. } else {
  49. pagination.pageNumber = 1;
  50. }
  51. };
  52. if (immediately) {
  53. //默认立即执行一次分页请求,如果不想如此,可以将第三个参数immediately传false
  54. fetchData();
  55. }
  56. watch(
  57. () => pagination.pageNumber,
  58. () => {
  59. fetchData();
  60. }
  61. );
  62. watch(
  63. () => pagination.pageSize,
  64. () => {
  65. search();
  66. }
  67. );
  68. return {
  69. loading,
  70. pagination,
  71. tableData,
  72. fetchData,
  73. search,
  74. onChange,
  75. onPageSizeChange,
  76. };
  77. }