GoodsList.vue 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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="skeleton-list" v-else-if="loading">
  9. <view class="skeleton-item" v-for="i in 6" :key="i">
  10. <u-skeleton rows="3" title :loading="loading" animate></u-skeleton>
  11. </view>
  12. </view>
  13. <view class="empty" v-else-if="!loading">
  14. <text class="empty-text">暂无商品</text>
  15. </view>
  16. <view class="load-more" v-if="hasMore && !loading && list.length > 0" @click="$emit('loadMore')">
  17. <text>加载更多</text>
  18. </view>
  19. </view>
  20. </template>
  21. <script>
  22. import GoodsCard from './GoodsCard.vue';
  23. export default {
  24. name: 'GoodsList',
  25. components: { GoodsCard },
  26. props: {
  27. list: { type: Array, default: () => [] },
  28. loading: { type: Boolean, default: false },
  29. hasMore: { type: Boolean, default: true },
  30. showPrice: { type: Boolean, default: true }
  31. }
  32. };
  33. </script>
  34. <style lang="scss" scoped>
  35. .goods-list {
  36. padding: 24rpx;
  37. background: #f5f5f5;
  38. min-height: 400rpx;
  39. padding-bottom: 120rpx;
  40. }
  41. .list-column {
  42. display: flex;
  43. flex-direction: column;
  44. gap: 24rpx;
  45. }
  46. .list-item {
  47. width: 100%;
  48. }
  49. .skeleton-list {
  50. display: flex;
  51. flex-direction: column;
  52. gap: 24rpx;
  53. }
  54. .skeleton-item {
  55. width: 100%;
  56. background: #fff;
  57. border-radius: 16rpx;
  58. overflow: hidden;
  59. padding: 20rpx;
  60. box-sizing: border-box;
  61. }
  62. .empty,
  63. .loading {
  64. padding: 80rpx 0;
  65. text-align: center;
  66. }
  67. .empty-text,
  68. .loading-text {
  69. font-size: 28rpx;
  70. color: #999;
  71. }
  72. .load-more {
  73. padding: 32rpx 0;
  74. text-align: center;
  75. }
  76. .load-more text {
  77. font-size: 28rpx;
  78. color: #FF233C;
  79. }
  80. </style>