useListQuery.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. // 文件路径: /mixins/useListQuery.js
  2. import {
  3. ref,
  4. reactive
  5. } from 'vue'
  6. /**
  7. * 通用列表查询 composable
  8. * @param {Function} apiFunction - 执行查询的API函数
  9. * @param {Object} defaultQuery - 默认查询参数
  10. * @returns {Object} 包含查询相关状态和方法的对象
  11. */
  12. export function useListQuery(apiFunction, defaultQuery = {}) {
  13. // 列表数据
  14. const dataList = ref([])
  15. // 加载状态
  16. const loading = ref(false)
  17. // 是否没有更多数据
  18. const noMore = ref(false)
  19. // 当前页码
  20. const pageNum = ref(1)
  21. // 每页条数
  22. const pageSize = ref(10)
  23. // 查询表单
  24. const queryForm = reactive({
  25. ...defaultQuery
  26. })
  27. // 获取列表数据
  28. const getDataList = async (isReset = false) => {
  29. if (loading.value) return
  30. loading.value = true
  31. // 如果是重置操作,重置页码和数据
  32. if (isReset) {
  33. pageNum.value = 1
  34. dataList.value = []
  35. noMore.value = false
  36. }
  37. try {
  38. // 调用传入的API函数
  39. const params = {
  40. pageNum: pageNum.value,
  41. pageSize: pageSize.value,
  42. ...queryForm
  43. }
  44. uni.showLoading({
  45. mask: true,
  46. title: "加载中"
  47. })
  48. const res = await apiFunction(params)
  49. // 处理返回数据
  50. const list = res.rows || res.data?.list || res.data || []
  51. const total = res.total || 0
  52. if (pageNum.value === 1) {
  53. dataList.value = list
  54. } else {
  55. dataList.value = [...dataList.value, ...list]
  56. }
  57. // 判断是否还有更多数据
  58. noMore.value = dataList.value.length >= total
  59. return res
  60. } catch (error) {
  61. console.error('获取列表数据失败:', error)
  62. throw error
  63. } finally {
  64. uni.stopPullDownRefresh();
  65. uni.hideLoading();
  66. loading.value = false
  67. }
  68. }
  69. // 搜索功能
  70. const handleSearch = () => {
  71. getDataList(true) // 重置并重新查询
  72. }
  73. // 重置查询条件
  74. const resetQuery = () => {
  75. // 重置查询表单为默认值
  76. Object.keys(defaultQuery).forEach(key => {
  77. queryForm[key] = defaultQuery[key]
  78. })
  79. // 清理不在默认查询中的字段
  80. Object.keys(queryForm).forEach(key => {
  81. if (!(key in defaultQuery)) {
  82. delete queryForm[key]
  83. }
  84. })
  85. getDataList(true)
  86. }
  87. // 加载更多数据
  88. const loadMore = () => {
  89. if (noMore.value) return
  90. console.log("触底加载更多")
  91. pageNum.value++
  92. getDataList()
  93. }
  94. // 刷新当前页数据
  95. const refresh = () => {
  96. getDataList()
  97. }
  98. return {
  99. // 数据状态
  100. dataList,
  101. loading,
  102. noMore,
  103. pageNum,
  104. pageSize,
  105. queryForm,
  106. // 方法
  107. getDataList,
  108. handleSearch,
  109. resetQuery,
  110. loadMore,
  111. refresh
  112. }
  113. }