<template> <view class="goodRecommend"> <ProductSkeleton :loading="loading" :isFirst="isFirst" /> <template v-if="!isFirst"> <view class="product-list"> <view class="product-list-box"> <view class="product-list-item-warp" v-for="(item,index) in productList" :key="index" > <view class="product-list-item" > <view class="product-list-img" @click="handleJumpProductDetail(item)" > <img v-show="item.image" class="img" :src="item.image" > </view> <view class="product-list-info u-skeleton-fillet"> <view class="product-name">{{ item.productName }}</view> <view class="flex"> <view class="shop-box" @click.stop="handleJumpStore(item)" > <view class="shop-name" @click="handleJumpProductDetail(item)" >{{ item.shopName }} </view> </view> <view class="buy-count">{{ item.users ? item.users : 0 }}{{$t('common.payticktip')}}</view> </view> <div class="price-warp"> <image class="iconImg" :src="getPriceActivity(item.activityType)" /> <div class="price"> ¥ {{ item.price }} </div> <div class="original-price"> ¥ {{ item.originalPrice }} </div> </div> </view> </view> </view> </view> </view > <!-- 空状态 --> <Empty background="#fff" :show="!loading && productList.length<0" src="http://36.138.125.206:8081/ceres-local-file/static/img/bgnull.png" > {{$t('client.emptydata')}} </Empty> <!-- 底部提示 --> <ListBottomTips v-show="loading || total!==0&&total===productList.length" :loading="loading" :type="productList.length<total?1:0" /> </template> </view> </template> <script> import Empty from "@/components/Empty"; import ProductSkeleton from "./components/ProductSkeleton"; import ListBottomTips from "@/components/ListBottomTips"; const NET = require('@/utils/request') const API = require('@/config/api') export default { name: "categoryShow", components: { Empty, ListBottomTips, ProductSkeleton }, props: { classifyId: { type: Number, default: 0 } }, computed: { // 获取活动小图标 getPriceActivity() { return (activityType) => { switch (activityType) { case 1: return require('../canvasShow/static/images/groupBuyIcon.png') case 2: return require('../canvasShow/static/images/spikeIcon.png') case 3: return require('../canvasShow/static/images/discountListIcon.png') case 4: return require('../canvasShow/static/images/spikeIcon.png') case 5: return require('../canvasShow/static/images/discountListIcon.png') case 8: return require('../canvasShow/static/images/memberCenterIcon.png') } } } }, data() { return { page: 1, pageSize: 10, total: 0, productList: [], isFirst:true, loading: true // 是否正在请求 } }, mounted() { this.handleResetList() this.handleResetPage() this.handleGetProductData(); }, methods: { // 重设苏族 handleResetList() { uni.pageScrollTo({ scrollTop: 0, duration: 0 }); this.isFirst = true this.productList = [] }, handleResetPage() { this.total = 0 this.page = 1 }, // 获取商品数据 handleGetProductData() { if (this.total !== 0 && this.productList.length >= this.total) { return } this.loading = true NET.request(API.getProductsV2, { classifyId: this.classifyId, page: this.page, pageSize: this.pageSize }, 'GET').then(res => { this.productList = [...this.productList, ...res.data.list] this.total = res.data.total }).catch(err => { throw Error(err) }).finally(() => { this.loading = false this.isFirst = false }) }, // 跳转到店铺主页 handleJumpStore(item) { uni.navigateTo({ url: `/pages_category_page1/store/index?storeId=${ item.shopId }` }) }, // 跳转到商品详情 handleJumpProductDetail(item) { uni.navigateTo({ url: '/pages_category_page1/goodsModule/goodsDetails?shopId=' + item.shopId + '&productId=' + item.productId + '&skuId=' + item .skuId }) } }, watch: { 'classifyId': { handler() { this.handleResetList() this.handleResetPage() this.handleGetProductData() }, deep: true } }, } </script> <style lang="scss" scoped > .goodRecommend { padding-top: 20rpx; .product-list { position: relative; padding: 0 13upx; width: 100%; //min-height: 60vh; &-box { display: flex; flex-wrap: wrap; flex-direction: row; &.swiper { height: 620upx; } } &.product-swiper .product-list-box { padding-left: 0; } &-item-warp { margin: 0 0 20upx 0; } &-item { width: 348upx; padding: 0 7upx; box-sizing: content-box; } &-img { width: 348upx; height: 348upx; background-color: white; border-radius: 10upx 10upx 0 0; .img { width: 100%; height: 100%; object-fit: contain; } } &-info { background-color: #FFFFFF; //box-shadow: 0px 0px 15px 0px rgba(52, 52, 52, 0.15); border-radius: 0 0 10upx 10upx; padding: 20upx; label { font-weight: normal; } .product-name { font-size: 28upx; color: #333; display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-bottom: 18upx; line-height: 40upx; } .flex { display: flex; align-items: center; } .shop-box { background-color: #333333; border-radius: 0upx 20upx 20upx 0upx; line-height: 40upx; display: flex; align-items: center; height: 40upx; margin-right: 10upx; float: left; .shop-name { font-size: 20upx; color: #FFEBC4; padding: 0 8upx 0 12upx; line-height: 40upx; display: inline-block; float: left; max-width: 170rpx; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; } .shop-logo { border: 2upx solid #707070; border-radius: 50%; overflow: hidden; float: right; img { width: 34upx; height: 34upx; display: block; } } } .buy-count { color: #C5AA7B; font-size: 20upx; border: 2upx solid #E4E5E6; line-height: 36upx; padding: 0 5upx; } .price-warp { display: flex; align-items: baseline; line-height: 56upx; .iconImg { width: 58rpx; height: 36rpx; margin-right: 10rpx; } .price { color: #C83732; font-size: 40upx; margin-right: 20upx; } .original-price { font-size: 24upx; color: #ccc; text-decoration: line-through; } } } } .emptyCart-box { margin-top: 70rpx; .emptyCart-img { width: 216rpx; height: 156rpx; } } } </style>