index.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. import { fetchGoodsList } from '../../../services/good/fetchGoodsList';
  2. import Toast from 'tdesign-miniprogram/toast/index';
  3. const initFilters = {
  4. overall: 1,
  5. sorts: '',
  6. layout: 0,
  7. };
  8. Page({
  9. data: {
  10. goodsList: [],
  11. layout: 0,
  12. sorts: '',
  13. overall: 1,
  14. show: false,
  15. minVal: '',
  16. maxVal: '',
  17. filter: initFilters,
  18. hasLoaded: false,
  19. loadMoreStatus: 0,
  20. loading: true,
  21. },
  22. pageNum: 1,
  23. pageSize: 30,
  24. total: 0,
  25. handleFilterChange(e) {
  26. const { layout, overall, sorts } = e.detail;
  27. this.pageNum = 1;
  28. this.setData({
  29. layout,
  30. sorts,
  31. overall,
  32. loadMoreStatus: 0,
  33. });
  34. this.init(true);
  35. },
  36. generalQueryData(reset = false) {
  37. const { filter, keywords, minVal, maxVal } = this.data;
  38. const { pageNum, pageSize } = this;
  39. const { sorts, overall } = filter;
  40. const params = {
  41. sort: 0, // 0 综合,1 价格
  42. pageNum: 1,
  43. pageSize: 30,
  44. keyword: keywords,
  45. };
  46. if (sorts) {
  47. params.sort = 1;
  48. params.sortType = sorts === 'desc' ? 1 : 0;
  49. }
  50. if (overall) {
  51. params.sort = 0;
  52. } else {
  53. params.sort = 1;
  54. }
  55. params.minPrice = minVal ? minVal * 100 : 0;
  56. params.maxPrice = maxVal ? maxVal * 100 : undefined;
  57. if (reset) return params;
  58. return {
  59. ...params,
  60. pageNum: pageNum + 1,
  61. pageSize,
  62. };
  63. },
  64. async init(reset = true) {
  65. const { loadMoreStatus, goodsList = [] } = this.data;
  66. const params = this.generalQueryData(reset);
  67. if (loadMoreStatus !== 0) return;
  68. this.setData({
  69. loadMoreStatus: 1,
  70. loading: true,
  71. });
  72. try {
  73. const result = await fetchGoodsList(params);
  74. const code = 'Success';
  75. const data = result;
  76. if (code.toUpperCase() === 'SUCCESS') {
  77. const { spuList, totalCount = 0 } = data;
  78. if (totalCount === 0 && reset) {
  79. this.total = totalCount;
  80. this.setData({
  81. emptyInfo: {
  82. tip: '抱歉,未找到相关商品',
  83. },
  84. hasLoaded: true,
  85. loadMoreStatus: 0,
  86. loading: false,
  87. goodsList: [],
  88. });
  89. return;
  90. }
  91. const _goodsList = reset ? spuList : goodsList.concat(spuList);
  92. const _loadMoreStatus = _goodsList.length === totalCount ? 2 : 0;
  93. this.pageNum = params.pageNum || 1;
  94. this.total = totalCount;
  95. this.setData({
  96. goodsList: _goodsList,
  97. loadMoreStatus: _loadMoreStatus,
  98. });
  99. } else {
  100. this.setData({
  101. loading: false,
  102. });
  103. wx.showToast({
  104. title: '查询失败,请稍候重试',
  105. });
  106. }
  107. } catch (error) {
  108. this.setData({
  109. loading: false,
  110. });
  111. }
  112. this.setData({
  113. hasLoaded: true,
  114. loading: false,
  115. });
  116. },
  117. onLoad() {
  118. this.init(true);
  119. },
  120. onReachBottom() {
  121. const { goodsList } = this.data;
  122. const { total = 0 } = this;
  123. if (goodsList.length === total) {
  124. this.setData({
  125. loadMoreStatus: 2,
  126. });
  127. return;
  128. }
  129. this.init(false);
  130. },
  131. handleAddCart() {
  132. Toast({
  133. context: this,
  134. selector: '#t-toast',
  135. message: '点击加购',
  136. });
  137. },
  138. tagClickHandle() {
  139. Toast({
  140. context: this,
  141. selector: '#t-toast',
  142. message: '点击标签',
  143. });
  144. },
  145. gotoGoodsDetail(e) {
  146. const { index } = e.detail;
  147. const { spuId } = this.data.goodsList[index];
  148. wx.navigateTo({
  149. url: `/pages/goods/details/index?spuId=${spuId}`,
  150. });
  151. },
  152. showFilterPopup() {
  153. this.setData({
  154. show: true,
  155. });
  156. },
  157. showFilterPopupClose() {
  158. this.setData({
  159. show: false,
  160. });
  161. },
  162. onMinValAction(e) {
  163. const { value } = e.detail;
  164. this.setData({ minVal: value });
  165. },
  166. onMaxValAction(e) {
  167. const { value } = e.detail;
  168. this.setData({ maxVal: value });
  169. },
  170. reset() {
  171. this.setData({ minVal: '', maxVal: '' });
  172. },
  173. confirm() {
  174. const { minVal, maxVal } = this.data;
  175. let message = '';
  176. if (minVal && !maxVal) {
  177. message = `价格最小是${minVal}`;
  178. } else if (!minVal && maxVal) {
  179. message = `价格范围是0-${minVal}`;
  180. } else if (minVal && maxVal && minVal <= maxVal) {
  181. message = `价格范围${minVal}-${this.data.maxVal}`;
  182. } else {
  183. message = '请输入正确范围';
  184. }
  185. if (message) {
  186. Toast({
  187. context: this,
  188. selector: '#t-toast',
  189. message,
  190. });
  191. }
  192. this.pageNum = 1;
  193. this.setData(
  194. {
  195. show: false,
  196. minVal: '',
  197. goodsList: [],
  198. loadMoreStatus: 0,
  199. maxVal: '',
  200. },
  201. () => {
  202. this.init();
  203. },
  204. );
  205. },
  206. });