useTable.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import { reactive, computed, toRefs } from "vue";
  2. /**
  3. * @description table 页面操作方法封装
  4. * @param {Function} api 获取表格数据 api 方法 (必传)
  5. * @param {Object} initParam 获取数据初始化参数 (非必传,默认为{})
  6. * @param {Boolean} isPageable 是否有分页 (非必传,默认为true)
  7. * @param {Function} dataCallBack 对后台返回的数据进行处理的方法 (非必传)
  8. * @param requestError
  9. * */
  10. export const useTable = (
  11. api?: (params: any) => Promise<any>,
  12. initParam: object = {},
  13. isPageable: boolean = true,
  14. dataCallBack?: (data: any) => any,
  15. requestError?: (error: any) => void
  16. ) => {
  17. const state = reactive<any>({
  18. // 表格数据
  19. tableData: [],
  20. // 分页数据
  21. pageable: {
  22. // 当前页数
  23. pageNum: 1,
  24. // 每页显示条数
  25. pageSize: 10,
  26. // 总条数
  27. total: 0
  28. },
  29. // 查询参数(只包括查询)
  30. searchParam: {},
  31. // 总参数(包含分页和查询参数)
  32. totalParam: {}
  33. });
  34. /**
  35. * @description 分页查询参数(只包括分页和表格字段排序,其他排序方式可自行配置)
  36. * */
  37. const pageParam = computed({
  38. get: () => {
  39. return {
  40. pageNum: state.pageable.pageNum,
  41. pageSize: state.pageable.pageSize
  42. };
  43. },
  44. set: (newVal: any) => {
  45. console.log("我是分页更新之后的值", newVal);
  46. }
  47. });
  48. /**
  49. * @description 获取表格数据
  50. * @return void
  51. * */
  52. const getTableList = async () => {
  53. if (!api) return;
  54. try {
  55. // 先把初始化参数和分页参数放到总参数里面
  56. Object.assign(state.totalParam, initParam, isPageable ? pageParam.value : {});
  57. let { data } = await api({ ...state.searchInitParam, ...state.totalParam });
  58. dataCallBack && (data = dataCallBack(data));
  59. state.tableData = isPageable ? data.list : data;
  60. // 解构后台返回的分页数据 (如果有分页更新分页信息)
  61. if (isPageable) {
  62. const { pageNum, pageSize, total } = data;
  63. updatePageable({ pageNum, pageSize, total });
  64. }
  65. } catch (error) {
  66. requestError && requestError(error);
  67. }
  68. };
  69. /**
  70. * @description 更新查询参数
  71. * @return void
  72. * */
  73. const updatedTotalParam = () => {
  74. state.totalParam = {};
  75. // 处理查询参数,可以给查询参数加自定义前缀操作
  76. let nowSearchParam: Table.StateProps["searchParam"] = {};
  77. // 防止手动清空输入框携带参数(这里可以自定义查询参数前缀)
  78. for (let key in state.searchParam) {
  79. // 某些情况下参数为 false/0 也应该携带参数
  80. if (state.searchParam[key] || state.searchParam[key] === false || state.searchParam[key] === 0) {
  81. nowSearchParam[key] = state.searchParam[key];
  82. }
  83. }
  84. Object.assign(state.totalParam, nowSearchParam, isPageable ? pageParam.value : {});
  85. };
  86. /**
  87. * @description 更新分页信息
  88. * @param {Object} pageable 后台返回的分页数据
  89. * @return void
  90. * */
  91. const updatePageable = (pageable: any) => {
  92. Object.assign(state.pageable, pageable);
  93. };
  94. /**
  95. * @description 表格数据查询
  96. * @return void
  97. * */
  98. const search = () => {
  99. state.pageable.pageNum = 1;
  100. updatedTotalParam();
  101. getTableList();
  102. };
  103. /**
  104. * @description 表格数据重置
  105. * @return void
  106. * */
  107. const reset = () => {
  108. state.pageable.pageNum = 1;
  109. // 重置搜索表单的时,如果有默认搜索参数,则重置默认的搜索参数
  110. state.searchParam = { ...state.searchInitParam };
  111. updatedTotalParam();
  112. getTableList();
  113. };
  114. /**
  115. * @description 每页条数改变
  116. * @param {Number} val 当前条数
  117. * @return void
  118. * */
  119. const handleSizeChange = (val: number) => {
  120. state.pageable.pageNum = 1;
  121. state.pageable.pageSize = val;
  122. getTableList();
  123. };
  124. /**
  125. * @description 当前页改变
  126. * @param {Number} val 当前页
  127. * @return void
  128. * */
  129. const handleCurrentChange = (val: number) => {
  130. state.pageable.pageNum = val;
  131. getTableList();
  132. };
  133. return {
  134. ...toRefs(state),
  135. getTableList,
  136. search,
  137. reset,
  138. handleSizeChange,
  139. handleCurrentChange,
  140. updatedTotalParam
  141. };
  142. };