useFetchTable.js 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import { ref, reactive, watch } 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. page: 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.page = pageInfo.current;
  18. };
  19. const onPageSizeChange = (size) => {
  20. pagination.pageSize = size;
  21. pagination.page = 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.page,
  30. pageSize: pagination.pageSize,
  31. ...(options.params?.value || {}),
  32. };
  33. let res = await apiFn(params);
  34. //下方代码 后续根据实际接口返回字段进行修改
  35. let list = Array.isArray(res.records) ? res.records : [];
  36. tableData.value = list;
  37. pagination.total = res.total;
  38. loading.value = false;
  39. options.fetchDataHandle && options.fetchDataHandle();
  40. } catch (err) {
  41. console.warn('分页请求错误:', err);
  42. }
  43. };
  44. const search = () => {
  45. if (pagination.page === 1) {
  46. fetchData();
  47. } else {
  48. pagination.page = 1;
  49. }
  50. };
  51. if (immediately) {
  52. //默认立即执行一次分页请求,如果不想如此,可以将第三个参数immediately传false
  53. fetchData();
  54. }
  55. watch(
  56. () => pagination.page,
  57. () => {
  58. fetchData();
  59. }
  60. );
  61. return {
  62. loading,
  63. pagination,
  64. tableData,
  65. fetchData,
  66. search,
  67. onChange,
  68. onPageSizeChange,
  69. };
  70. }