148 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Vue
		
	
	
<!-- 装修商品组件:商品栏 -->
 | 
						||
<template>
 | 
						||
  <view>
 | 
						||
    <!-- 布局1. 两列商品,图片左文案右 -->
 | 
						||
    <view
 | 
						||
      v-if="layoutType === 'twoCol'"
 | 
						||
      class="goods-xs-box ss-flex ss-flex-wrap"
 | 
						||
      :style="[{ margin: '-' + data.space + 'rpx' }]"
 | 
						||
    >
 | 
						||
      <view
 | 
						||
        class="goods-xs-list"
 | 
						||
        v-for="item in goodsList"
 | 
						||
        :key="item.id"
 | 
						||
        :style="[
 | 
						||
          {
 | 
						||
            padding: data.space + 'rpx',
 | 
						||
          },
 | 
						||
        ]"
 | 
						||
      >
 | 
						||
        <s-goods-column
 | 
						||
          class="goods-card"
 | 
						||
          size="xs"
 | 
						||
          :goodsFields="data.fields"
 | 
						||
          :tagStyle="data.badge"
 | 
						||
          :data="item"
 | 
						||
          :titleColor="data.fields.name?.color"
 | 
						||
          :topRadius="data.borderRadiusTop"
 | 
						||
          :bottomRadius="data.borderRadiusBottom"
 | 
						||
          :titleWidth="(454 - marginRight * 2 - data.space * 2 - marginLeft * 2) / 2"
 | 
						||
          @click="sheep.$router.go('/pages/goods/index', { id: item.id })"
 | 
						||
        />
 | 
						||
      </view>
 | 
						||
    </view>
 | 
						||
    <!-- 布局. 三列商品:图片上文案下 -->
 | 
						||
    <view
 | 
						||
      v-if="layoutType === 'threeCol'"
 | 
						||
      class="goods-sm-box ss-flex ss-flex-wrap"
 | 
						||
      :style="[{ margin: '-' + data.space + 'rpx' }]"
 | 
						||
    >
 | 
						||
      <view
 | 
						||
        v-for="item in goodsList"
 | 
						||
        :key="item.id"
 | 
						||
        class="goods-card-box"
 | 
						||
        :style="[
 | 
						||
          {
 | 
						||
            padding: data.space + 'rpx',
 | 
						||
          },
 | 
						||
        ]"
 | 
						||
      >
 | 
						||
        <s-goods-column
 | 
						||
          class="goods-card"
 | 
						||
          size="sm"
 | 
						||
          :goodsFields="data.fields"
 | 
						||
          :tagStyle="data.badge"
 | 
						||
          :data="item"
 | 
						||
          :titleColor="data.fields.name?.color"
 | 
						||
          :topRadius="data.borderRadiusTop"
 | 
						||
          :bottomRadius="data.borderRadiusBottom"
 | 
						||
          @click="sheep.$router.go('/pages/goods/index', { id: item.id })"
 | 
						||
        />
 | 
						||
      </view>
 | 
						||
    </view>
 | 
						||
 | 
						||
    <!-- 布局3. 一行商品,水平滑动 -->
 | 
						||
    <view v-if="layoutType === 'horizSwiper'" class="">
 | 
						||
      <scroll-view class="scroll-box goods-scroll-box" scroll-x scroll-anchoring>
 | 
						||
        <view class="goods-box ss-flex">
 | 
						||
          <view
 | 
						||
            class="goods-card-box"
 | 
						||
            v-for="item in goodsList"
 | 
						||
            :key="item.id"
 | 
						||
            :style="[{ marginRight: data.space * 2 + 'rpx' }]"
 | 
						||
          >
 | 
						||
            <s-goods-column
 | 
						||
              class="goods-card"
 | 
						||
              size="sm"
 | 
						||
              :goodsFields="data.fields"
 | 
						||
              :tagStyle="data.badge"
 | 
						||
              :data="item"
 | 
						||
              :titleColor="data.fields.name?.color"
 | 
						||
              :titleWidth="(750 - marginRight * 2 - data.space * 4 - marginLeft * 2) / 3"
 | 
						||
              @click="sheep.$router.go('/pages/goods/index', { id: item.id })"
 | 
						||
            />
 | 
						||
          </view>
 | 
						||
        </view>
 | 
						||
      </scroll-view>
 | 
						||
    </view>
 | 
						||
  </view>
 | 
						||
</template>
 | 
						||
 | 
						||
<script setup>
 | 
						||
  /**
 | 
						||
   * 商品栏
 | 
						||
   */
 | 
						||
  import { onMounted, ref, computed } from 'vue';
 | 
						||
  import sheep from '@/sheep';
 | 
						||
  import SpuApi from "@/sheep/api/product/spu";
 | 
						||
 | 
						||
  const props = defineProps({
 | 
						||
    data: {
 | 
						||
      type: Object,
 | 
						||
      default() {},
 | 
						||
    },
 | 
						||
    styles: {
 | 
						||
      type: Object,
 | 
						||
      default() {},
 | 
						||
    },
 | 
						||
  });
 | 
						||
  const { layoutType, spuIds } = props.data;
 | 
						||
  let { marginLeft, marginRight } = props.styles;
 | 
						||
  const goodsList = ref([]);
 | 
						||
  onMounted(async () => {
 | 
						||
    if (spuIds.length > 0) {
 | 
						||
      let { data } = await SpuApi.getSpuListByIds(spuIds.join(','));
 | 
						||
      goodsList.value = data;
 | 
						||
    }
 | 
						||
  });
 | 
						||
</script>
 | 
						||
 | 
						||
<style lang="scss" scoped>
 | 
						||
  .goods-xs-box {
 | 
						||
    // margin: 0 auto;
 | 
						||
    width: 100%;
 | 
						||
    .goods-xs-list {
 | 
						||
      box-sizing: border-box;
 | 
						||
      flex-shrink: 0;
 | 
						||
      overflow: hidden;
 | 
						||
      width: 50%;
 | 
						||
    }
 | 
						||
  }
 | 
						||
 | 
						||
  .goods-sm-box {
 | 
						||
    margin: 0 auto;
 | 
						||
    box-sizing: border-box;
 | 
						||
    .goods-card-box {
 | 
						||
      flex-shrink: 0;
 | 
						||
      overflow: hidden;
 | 
						||
      width: 33.3%;
 | 
						||
      box-sizing: border-box;
 | 
						||
    }
 | 
						||
  }
 | 
						||
  .goods-scroll-box {
 | 
						||
    margin: 0 auto;
 | 
						||
    width: 100%;
 | 
						||
    box-sizing: border-box;
 | 
						||
  }
 | 
						||
</style>
 |