useLoadPageList.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import {
  2. reactive,
  3. ref,
  4. } from "vue"
  5. /**
  6. * 列表控制hooks
  7. * @param {Function} fn:请求列表的api函数
  8. * @param {object} parmas:列表 除page:1,limit: 10的额外参数
  9. */
  10. export const useLoadPageList = (getDataFn, parmas) => {
  11. // 列表数据
  12. const listData = ref([])
  13. // 列表参数
  14. const listParmas = reactive({
  15. page: 1,
  16. limit: 10,
  17. });
  18. // 下拉状态
  19. const loadStatus = ref('loadmore')
  20. // 自定义scrollview状态控制
  21. const scrollViewTool = reactive({
  22. triggered: false, //当前下拉刷新状态,true 表示下拉刷新已经被触发,false 表示下拉刷新未被触发
  23. isEnabled: true, //是否开启下拉
  24. })
  25. /**
  26. * 获取分页列表
  27. * @param {string} type: refresh :当前页刷新 more: 拼接下一页
  28. * @param {object} parmas:{} 列表参数
  29. */
  30. const getListData = async (type = 'refresh') => {
  31. if (!getDataFn) {
  32. console.warn('请求结束:useLoadPageList()中未传入请求列表函数')
  33. return
  34. }
  35. loadStatus.value = 'loading'
  36. const result = await getDataFn({
  37. ...listParmas,
  38. ...parmas
  39. })
  40. if (result) {
  41. const {
  42. last_page,
  43. data,
  44. } = result.data
  45. if (type == 'refresh') {
  46. listData.value = data
  47. } else {
  48. listData.value = [...listData.value, ...data]
  49. }
  50. if (listParmas.page >= last_page) {
  51. loadStatus.value = 'nomore';
  52. } else {
  53. loadStatus.value = 'loadmore';
  54. }
  55. }
  56. }
  57. /**
  58. * 触底添加下一页
  59. */
  60. const reachBottom = () => {
  61. if (loadStatus.value === 'loadmore') {
  62. loadStatus.value = 'loading'
  63. uni.showNavigationBarLoading()
  64. setTimeout(() => {
  65. listParmas.page += 1;
  66. getListData('more')
  67. uni.hideNavigationBarLoading()
  68. }, 1000);
  69. }
  70. }
  71. /**
  72. * 下拉列表页
  73. */
  74. const pullDownRefresh = () => {
  75. scrollViewTool.triggered = true;
  76. setTimeout(() => {
  77. scrollViewTool.triggered = false;
  78. uni.stopPullDownRefresh()
  79. reSetList()
  80. }, 1000)
  81. }
  82. /**
  83. * 列表重置第一页
  84. */
  85. const reSetList = () => {
  86. listParmas.page = 1
  87. getListData('refresh')
  88. }
  89. /**
  90. * 新增列表
  91. * @param {Number} i:0 新增的位置索引值
  92. * @param {Object} v: 新增数据
  93. */
  94. const addList = (i = 0, v) => listData.value.splice(i, 0, v);
  95. /**
  96. * 删除列表
  97. * @param {Number} i:0 删除的位置索引值
  98. * @param {Number} n:1 删除几个
  99. */
  100. const delList = (i = 0, n = 1) => listData.value.splice(i, n);
  101. /**
  102. * 修改列表
  103. * @param {Function} getDetailsFn:获取详情函数
  104. * @param {Object} detailsParmas:获取详情参数
  105. */
  106. const editList = async (getDetailsFn, detailsParmas) => {
  107. if (!getDetailsFn) {
  108. console.warn('请求结束:editList()中未传入请求详情函数')
  109. return
  110. }
  111. let res = await getDetailsFn(detailsParmas)
  112. if (res) {
  113. const {
  114. id
  115. } = res.data
  116. let idx = listData.value.findIndex(item => item.id == id)
  117. if (idx > -1) {
  118. listData.value[idx] = res.data
  119. } else {
  120. console.warn(`在列表中未找到ID为${id}的索引`);
  121. }
  122. }
  123. }
  124. return {
  125. listData,
  126. listParmas,
  127. loadStatus,
  128. scrollViewTool,
  129. getListData,
  130. reachBottom,
  131. pullDownRefresh,
  132. reSetList,
  133. addList,
  134. delList,
  135. editList,
  136. }
  137. }