GoodsList.vue 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. <template>
  2. <view class="goods-list">
  3. <view class="list-column" v-if="list && list.length > 0">
  4. <view class="list-item" v-for="(item, index) in list" :key="item.productId">
  5. <GoodsCard :item="item" :show-price="showPrice" @click="$emit('itemClick', item)" />
  6. </view>
  7. </view>
  8. <view class="empty" v-else-if="!loading">
  9. <text class="empty-text">暂无商品</text>
  10. </view>
  11. <view class="loading" v-if="loading">
  12. <text class="loading-text">加载中...</text>
  13. </view>
  14. <view class="load-more" v-if="hasMore && !loading && list.length > 0" @click="$emit('loadMore')">
  15. <text>加载更多</text>
  16. </view>
  17. </view>
  18. </template>
  19. <script>
  20. import GoodsCard from './GoodsCard.vue';
  21. export default {
  22. name: 'GoodsList',
  23. components: { GoodsCard },
  24. props: {
  25. list: { type: Array, default: () => [] },
  26. loading: { type: Boolean, default: false },
  27. hasMore: { type: Boolean, default: true },
  28. showPrice: { type: Boolean, default: true }
  29. }
  30. };
  31. </script>
  32. <style lang="scss" scoped>
  33. .goods-list {
  34. padding: 24rpx;
  35. background: #f5f5f5;
  36. min-height: 400rpx;
  37. padding-bottom: 120rpx;
  38. }
  39. .list-column {
  40. display: flex;
  41. flex-direction: column;
  42. gap: 24rpx;
  43. }
  44. .list-item {
  45. width: 100%;
  46. }
  47. .empty,
  48. .loading {
  49. padding: 80rpx 0;
  50. text-align: center;
  51. }
  52. .empty-text,
  53. .loading-text {
  54. font-size: 28rpx;
  55. color: #999;
  56. }
  57. .load-more {
  58. padding: 32rpx 0;
  59. text-align: center;
  60. }
  61. .load-more text {
  62. font-size: 28rpx;
  63. color: #FF233C;
  64. }
  65. </style>