recommendList.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. <template>
  2. <view class="page">
  3. <view class="top-fixed">
  4. <!-- 搜索框 -->
  5. <view class="search-cont">
  6. <view class="inner">
  7. <image class="icon-search" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search.png" mode=""></image>
  8. <input type="text" @confirm="goSearch" :value="keyword" placeholder="输入商品名称" placeholder-style="font-size:28rpx;color:#BBBBBB;font-family: PingFang SC;" />
  9. </view>
  10. <!-- <view class="icon-search">
  11. <image @click="showChange(2)" v-if="showType==1" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search1.png" mode=""></image>
  12. <image @click="showChange(1)" v-if="showType==2" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/search2.png" mode=""></image>
  13. </view> -->
  14. </view>
  15. <!-- 排序框 -->
  16. <!-- <view class="sort-box">
  17. <view class="item" :class="form.defaultOrder=='desc'?'active':''" @click="searchChange('1')">
  18. <text class="label">默认</text>
  19. </view>
  20. <view class="item" :class="form.defaultOrder=='desc'?'active':''" @click="searchChange('1')">
  21. <text class="label">新品</text>
  22. </view>
  23. <view class="item" :class="form.defaultOrder=='desc'?'active':''" @click="searchChange('1')">
  24. <text class="label">默认</text>
  25. </view>
  26. <view class="item" @click="searchChange('2')">
  27. <text class="label">价格</text>
  28. <view class="sort-img">
  29. <image v-if="form.priceOrder==null||form.priceOrder=='desc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_up.png" mode="" @click="priceUp(true)"></image>
  30. <image v-if="form.priceOrder=='asc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_up2.png" mode="" @click="priceUp(false)"></image>
  31. <image v-if="form.priceOrder==null||form.priceOrder=='asc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_down.png" mode="" @click="priceDown(true)"></image>
  32. <image v-if="form.priceOrder=='desc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_down2.png" mode="" @click="priceDown(false)"></image>
  33. </view>
  34. </view>
  35. <view class="item" @click="searchChange('3')">
  36. <text class="label">销量</text>
  37. <view class="sort-img">
  38. <image v-if="form.salesOrder==null||form.salesOrder=='desc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_up.png" mode="" @click="saleUp(true)"></image>
  39. <image v-if="form.salesOrder=='asc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_up2.png" mode="" @click="saleUp(false)"></image>
  40. <image v-if="form.salesOrder==null||form.salesOrder=='asc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_down.png" mode="" @click="saleDown(true)"></image>
  41. <image v-if="form.salesOrder=='desc'" src="https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/price_arrow_down2.png" mode="" @click="saleDown(false)"></image>
  42. </view>
  43. </view>
  44. <view class="item" :class="form.newOrder=='desc'?'active':''" @click="searchChange('4')">
  45. <text class="label">新品</text>
  46. </view>
  47. </view> -->
  48. </view>
  49. <mescroll-body
  50. top="100rpx" bottom="40rpx"
  51. ref="mescrollRef"
  52. @init="mescrollInit"
  53. @down="downCallback"
  54. @up="upCallback"
  55. :down="downOption"
  56. :up="upOption"
  57. >
  58. <view class="list-wrap">
  59. <view class="goods-grid">
  60. <view class="grid-item" v-for="(item, index) in dataList" :key="item.productId">
  61. <GoodsCard :item="item" :show-price="true" @click="showProduct(item)" />
  62. </view>
  63. </view>
  64. </view>
  65. </mescroll-body>
  66. </view>
  67. </template>
  68. <script>
  69. import { getHomeGoodsRecommend } from '@/api/home.js'
  70. import MescrollMixin from '@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js'
  71. import GoodsCard from './components/GoodsCard.vue'
  72. export default {
  73. name: 'RecommendList',
  74. components: { GoodsCard },
  75. mixins: [MescrollMixin],
  76. data() {
  77. return {
  78. type: 'hot',
  79. titleMap: { hot: '热卖有机', green: '上新推荐' },
  80. mescroll: null,
  81. keyword:'',
  82. downOption: {},
  83. upOption: {
  84. onScroll: true,
  85. use: true,
  86. page: {
  87. num: 0,
  88. size: 10
  89. },
  90. noMoreSize: 10,
  91. empty: {
  92. icon: 'https://jnlzjk-1323137866.cos.ap-chongqing.myqcloud.com/shop/images/no_data.png',
  93. tip: '暂无商品'
  94. },
  95. textNoMore: '已经到底了'
  96. },
  97. dataList: []
  98. }
  99. },
  100. onLoad(options) {
  101. this.type = (options.type || 'green').toLowerCase()
  102. if (this.type !== 'green' && this.type !== 'hot') this.type = 'green'
  103. uni.setNavigationBarTitle({ title: this.titleMap[this.type]})
  104. },
  105. methods: {
  106. goSearch(e) {
  107. this.keyword=e.detail.value;
  108. this.mescroll.resetUpScroll();
  109. },
  110. mescrollInit(mescroll) {
  111. this.mescroll = mescroll
  112. },
  113. downCallback(mescroll) {
  114. mescroll.resetUpScroll()
  115. },
  116. upCallback(page) {
  117. const that = this
  118. getHomeGoodsRecommend({
  119. keyword:this.keyword,
  120. type: that.type,
  121. pageNum: page.num,
  122. pageSize: page.size
  123. }).then(res => {
  124. if(res.code==200){
  125. //设置列表数据
  126. if (page.num == 1) {
  127. that.dataList = res.data.list;
  128. } else {
  129. that.dataList = that.dataList.concat(res.data.list);
  130. }
  131. that.mescroll.endBySize(res.data.list.length, res.data.total);
  132. }else{
  133. uni.showToast({
  134. icon:'none',
  135. title: "请求失败",
  136. });
  137. that.dataList = null;
  138. that.mescroll.endErr();
  139. }
  140. }).catch(() => {
  141. that.dataList = page.num == 1 ? [] : that.dataList
  142. that.mescroll.endErr()
  143. })
  144. },
  145. showProduct(item) {
  146. if (item && item.productId) {
  147. uni.navigateTo({ url: '/pages/shopping/productDetails?productId=' + item.productId })
  148. }
  149. }
  150. }
  151. }
  152. </script>
  153. <style lang="scss" scoped>
  154. .top-fixed{
  155. width: 100%;
  156. position: fixed;
  157. // top: 0;
  158. left: 0;
  159. z-index: 10;
  160. }
  161. .search-cont{
  162. padding: 16upx 30upx;
  163. background-color: #FFFFFF;
  164. display:flex;
  165. align-items: center;
  166. justify-content: space-between;
  167. .inner{
  168. box-sizing: border-box;
  169. width: 100%;
  170. height: 72upx;
  171. background: #F7F7F7;
  172. border-radius: 36upx;
  173. display: flex;
  174. align-items: center;
  175. padding: 0 30upx;
  176. .icon-search{
  177. width: 28upx;
  178. height: 28upx;
  179. margin-right: 20upx;
  180. }
  181. input{
  182. height: 60upx;
  183. line-height: 60upx;
  184. flex: 1;
  185. }
  186. }
  187. .icon-search{
  188. margin-left: 10upx;
  189. width: 40upx;
  190. height: 40upx;
  191. image{
  192. width: 40upx;
  193. height: 40upx;
  194. }
  195. }
  196. }
  197. .page {
  198. min-height: 100vh;
  199. background: #f5f5f5;
  200. }
  201. .list-wrap {
  202. padding: 24rpx;
  203. }
  204. .goods-grid {
  205. display: flex;
  206. flex-direction: column;
  207. gap: 20rpx;
  208. }
  209. .goods-grid .grid-item {
  210. width: 100%;
  211. }
  212. </style>