useTable.ts 4.1 KB

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