跳至主要內容

商品SKU对话框

起凡大约 5 分钟起凡商城小程序商品SKU

商品SKU对话框

效果

商品SKU对话框
商品SKU对话框

源码解析

对话框

<template>
  <div>
    <div class="product-dialog">
      <!-- 这步不能使用 v-model:visible="visible" 因为visible不能从子组件更新 -->
      <!-- 通过继续把事件emit出去实现双向绑定。emit('update:visible', visible) -->
      <nut-popup
        :visible="visible"
        round
        pop-class="product-popup"
        @update:visible="(value) => emit('update:visible', value)"
      ></nut-popup
      >
    </div>
  </div>
</template>





 
 
 
 
 
 
 



对话框内滚动区域

<template>
  <div>
    <div class="product-dialog">
      <!-- 这步不能使用 v-model:visible="visible" 因为visible不能从子组件更新 -->
      <!-- 通过继续把事件emit出去实现双向绑定。emit('update:visible', visible) -->
      <nut-popup
        :visible="visible"
        round
        pop-class="product-popup"
        @update:visible="(value) => emit('update:visible', value)"
      >
        <!-- 当设置scroll-y=true 时需要设置固定的高度 -->
        <scroll-view class="product-section" :scroll-y="true">
        </scroll-view></nut-popup
      >
    </div>
  </div>
</template>











 
 
 




商品SKU展示骨架

<template>
  <div>
    <div class="product-dialog">
      <nut-popup
        :visible="visible"
        round
        pop-class="product-popup"
        @update:visible="(value) => emit('update:visible', value)"
      >
        <scroll-view class="product-section" :scroll-y="true">
          <!-- 显示图片 -->
          <div>
          </div>
          <!-- 显示名称 -->
          <div class="product-name"></div>
          <!-- 显示描述 -->
          <div class="product-description">
          </div>
          <!-- 显示属性 -->
          <div class="attributes">
          </div>
          <!-- 已选属性值 -->
          <div class="choose">
          </div>
          <!-- 价格 -->
          <div class="result">
          </div>
        </scroll-view></nut-popup
      >
    </div>
  </div>
</template>










 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 





sku选择

选择属性确定SKU
选择属性确定SKU
<template>
  <div>
    <div class="product-dialog">
      <nut-popup
        :visible="visible"
        round
        pop-class="product-popup"
        @update:visible="(value) => emit('update:visible', value)"
      >
        <scroll-view class="product-section" :scroll-y="true">
          <!-- 忽略... -->
          <div class="attributes">
            <!-- 遍历商品属性 -->
            <div
              v-for="(attribute, index) in attributes"
              :key="attribute.name"
              class="attribute-row"
            >
            <!-- 每个属性的名称 -->
              <div class="attribute-name">{{ attribute.name }}</div>
              <!-- 每个属性的值列表 -->
              <div class="values">
                <!-- 遍历值列表, 每个属性同一时间只能选一个值,选中时显示激活颜色 -->
                <div
                  v-for="value in attribute.values"
                  :key="value"
                  :class="[
                    'value',
                    attribute.activeValue === value ? 'active' : '',
                  ]"
                  @click="() => changeActive(value, attribute)"
                >
                  {{ value }}
                </div>
              </div>
            </div>
          </div>
          <div class="choose">
            <div class="values">
              <span class="prefix">已选择规格:</span>
              {{ chooseAttribute.join("、") }}
            </div>
          </div>
          <div class="result">
          </div>
        </scroll-view></nut-popup
      >
    </div>
  </div>
</template>











 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 







封面/名称/描述

封面名称描述
封面名称描述
<template>
  <div>
    <div class="product-dialog">
      <nut-popup
        :visible="visible"
        round
        pop-class="product-popup"
        @update:visible="(value) => emit('update:visible', value)"
      >
        <scroll-view class="product-section" :scroll-y="true" v-if="activeSku">
          <div>
            <!-- 由于在样式中固定了图片的高度和宽度为了使图片 aspectFill优先保证图片的比例,切割掉多余的图片 -->
            <image
              class="product-cover"
              :src="activeSku.cover"
              :mode="'aspectFill'"
            ></image>
          </div>
          <div class="product-name">{{ activeSku.name }}</div>
          <div class="product-description">
            {{ activeSku.description }}
          </div>
         <!-- 忽略... -->
        </scroll-view></nut-popup
      >
    </div>
  </div>
</template>










 
 
 
 
 
 
 
 
 
 
 
 






加入购物车

价格和加入购物车
价格和加入购物车
<template>
  <div>
    <div class="product-dialog">
      <nut-popup
        :visible="visible"
        round
        pop-class="product-popup"
        @update:visible="(value) => emit('update:visible', value)"
      >
        <scroll-view class="product-section" :scroll-y="true" v-if="activeSku">
        <!-- 忽略... -->
          <div class="result">
            <div class="total-price">
              <span>总计</span>
              <span class="price-prefix"></span>
              <span class="price">
                {{ activeSku.price }}
              </span>
            </div>
            <div class="add-cert" @click="() => addProduct()">
              <span class="prefix">+</span>加入购物车
            </div>
          </div>
        </scroll-view></nut-popup
      >
    </div>
  </div>
</template>