当前位置:首页 > VUE

vue实现商品sku

2026-01-18 07:02:32VUE

Vue 实现商品 SKU 选择功能

数据结构设计

商品 SKU 通常由多个属性组合而成,例如颜色、尺寸等。需要设计一个嵌套数据结构来存储这些信息。

data() {
  return {
    skuData: {
      colors: ['红色', '蓝色', '绿色'],
      sizes: ['S', 'M', 'L'],
      // 库存信息,key 为属性组合
      stock: {
        '红色-S': 10,
        '红色-M': 5,
        '蓝色-L': 8
        // 其他组合...
      }
    },
    selected: {
      color: '',
      size: ''
    }
  }
}

模板渲染

使用 v-for 循环渲染可选的 SKU 属性,并通过计算属性判断哪些选项可选。

<div class="sku-selector">
  <div class="attribute">
    <h3>颜色</h3>
    <button 
      v-for="color in skuData.colors" 
      :key="color"
      @click="selectAttribute('color', color)"
      :class="{ active: selected.color === color, disabled: !isAttributeAvailable('color', color) }"
    >
      {{ color }}
    </button>
  </div>

  <div class="attribute">
    <h3>尺寸</h3>
    <button 
      v-for="size in skuData.sizes" 
      :key="size"
      @click="selectAttribute('size', size)"
      :class="{ active: selected.size === size, disabled: !isAttributeAvailable('size', size) }"
    >
      {{ size }}
    </button>
  </div>
</div>

交互逻辑实现

实现属性选择和库存检查的方法。

methods: {
  selectAttribute(type, value) {
    this.selected[type] = value
    this.checkCombination()
  },

  isAttributeAvailable(type, value) {
    const tempSelected = { ...this.selected }
    tempSelected[type] = value
    const combination = this.getCombinationKey(tempSelected)
    return this.skuData.stock[combination] > 0
  },

  getCombinationKey(selected) {
    return `${selected.color}-${selected.size}`
  },

  checkCombination() {
    const combination = this.getCombinationKey(this.selected)
    if (this.skuData.stock[combination]) {
      console.log('当前选择有库存')
    } else {
      console.log('当前选择无库存')
    }
  }
}

样式处理

为选中的状态和不可选状态添加样式区分。

.sku-selector button {
  margin: 5px;
  padding: 8px 12px;
  border: 1px solid #ddd;
  background: #fff;
  cursor: pointer;
}

.sku-selector button.active {
  border-color: #ff6700;
  color: #ff6700;
}

.sku-selector button.disabled {
  opacity: 0.5;
  cursor: not-allowed;
}

完整示例改进

对于更复杂的 SKU 情况,可以使用递归组件处理多级属性。

// SKU 组件
Vue.component('sku-selector', {
  props: ['attributes', 'selected', 'stock'],
  template: `
    <div class="sku-attribute">
      <h3>{{ attributes.name }}</h3>
      <div class="sku-values">
        <button
          v-for="value in attributes.values"
          :key="value"
          @click="$emit('select', attributes.name, value)"
          :class="{
            active: selected[attributes.name] === value,
            disabled: !isAvailable(attributes.name, value)
          }"
        >
          {{ value }}
        </button>
      </div>
    </div>
  `,
  methods: {
    isAvailable(name, value) {
      const temp = { ...this.selected, [name]: value }
      return this.checkStock(temp)
    },
    checkStock(selected) {
      const key = Object.values(selected).join('-')
      return this.stock[key] > 0
    }
  }
})

注意事项

  • 后端 API 通常返回所有 SKU 组合及其库存信息
  • 对于大量 SKU 的情况,考虑性能优化,如虚拟滚动
  • 可以添加 SKU 图片切换功能,当选择不同颜色时显示对应商品图
  • 移动端适配需要考虑触摸反馈和布局调整

这种实现方式提供了良好的用户体验,清晰地展示了可选和不可选的 SKU 组合,帮助用户快速完成商品规格选择。

vue实现商品sku

标签: 商品vue
分享给朋友:

相关文章

vue实现签名

vue实现签名

实现Vue签名功能的步骤 安装签名库 使用vue-signature库可以快速实现签名功能。通过npm或yarn安装: npm install vue-signature --save # 或 ya…

vue实现视频开场

vue实现视频开场

使用 Vue 实现视频开场动画 在 Vue 中实现视频开场动画可以通过结合 HTML5 的 <video> 标签和 Vue 的过渡效果或生命周期钩子来完成。以下是具体实现方法: 安装依赖…

vue手写签名如何实现

vue手写签名如何实现

实现手写签名的基本思路 在Vue中实现手写签名功能,通常需要借助HTML5的Canvas API来捕获用户的绘制操作。核心流程包括初始化画布、监听触摸/鼠标事件、记录轨迹以及生成签名图片。 安装依…

vue实现走势图

vue实现走势图

Vue 实现走势图的方法 使用 ECharts 库 ECharts 是一个强大的数据可视化库,支持多种图表类型,包括走势图(折线图)。在 Vue 项目中可以通过 vue-echarts 封装库或直接使…

vue实现字母添加排序

vue实现字母添加排序

实现字母添加排序的方法 在Vue中实现字母添加排序功能,可以通过以下步骤完成: 创建Vue实例并定义数据 new Vue({ el: '#app', data: { letters…

vue实现上移下移插件

vue实现上移下移插件

实现上移下移功能的 Vue 插件 在 Vue 中实现列表项的上移和下移功能,可以通过自定义指令或组件封装的方式完成。以下是两种常见实现方式: 基于数组操作的通用方法 通过操作数组索引实现元素位置交…