当前位置:首页 > VUE

vue实现商品多规格

2026-02-24 04:56:32VUE

Vue 实现商品多规格功能

数据结构设计

商品多规格通常需要嵌套数据结构,常见方案是使用skusspecs的组合。例如:

data() {
  return {
    product: {
      specs: [
        {
          name: '颜色',
          values: ['红色', '黑色', '金色']
        },
        {
          name: '内存',
          values: ['64G', '128G', '256G']
        }
      ],
      skus: [
        {
          specValues: ['红色', '64G'],
          price: 5999,
          stock: 100
        },
        // 其他SKU组合...
      ]
    }
  }
}

规格选择交互

使用v-for渲染规格选项,并通过计算属性处理选中状态:

vue实现商品多规格

<div v-for="spec in product.specs" :key="spec.name">
  <h3>{{ spec.name }}</h3>
  <button 
    v-for="value in spec.values"
    :key="value"
    @click="selectSpec(spec.name, value)"
    :class="{ active: isSelected(spec.name, value) }"
  >
    {{ value }}
  </button>
</div>

状态管理逻辑

通过selectedSpecs对象记录当前选择,并实时计算可用SKU:

vue实现商品多规格

methods: {
  selectSpec(specName, value) {
    this.$set(this.selectedSpecs, specName, value)
  },
  isSelected(specName, value) {
    return this.selectedSpecs[specName] === value
  }
},
computed: {
  availableSkus() {
    return this.product.skus.filter(sku => {
      return Object.entries(this.selectedSpecs).every(
        ([specName, value]) => sku.specValues.includes(value)
      )
    })
  }
}

库存与价格联动

根据当前选择的规格组合显示对应信息:

<div v-if="currentSku">
  <p>价格: {{ currentSku.price }}</p>
  <p>库存: {{ currentSku.stock }}</p>
</div>
computed: {
  currentSku() {
    return this.availableSkus.find(sku => 
      sku.specValues.length === Object.values(this.selectedSpecs).length
    )
  }
}

禁用不可选规格

通过计算属性实现规格的禁用状态:

computed: {
  isDisabled() {
    return (specName, value) => {
      const tempSelected = {...this.selectedSpecs, [specName]: value}
      return !this.product.skus.some(sku =>
        Object.entries(tempSelected).every(
          ([name, val]) => sku.specValues.includes(val)
        )
      )
    }
  }
}

完整组件示例

<template>
  <div class="spec-container">
    <!-- 规格选择区域 -->
    <div v-for="spec in product.specs" :key="spec.name">
      <h3>{{ spec.name }}</h3>
      <button
        v-for="value in spec.values"
        :key="value"
        @click="selectSpec(spec.name, value)"
        :class="{
          active: isSelected(spec.name, value),
          disabled: isDisabled(spec.name, value)
        }"
        :disabled="isDisabled(spec.name, value)"
      >
        {{ value }}
      </button>
    </div>

    <!-- 商品信息展示 -->
    <div v-if="currentSku" class="sku-info">
      <p>已选择: {{ Object.values(selectedSpecs).join(' + ') }}</p>
      <p>价格: ¥{{ currentSku.price }}</p>
      <p>库存: {{ currentSku.stock }}件</p>
    </div>
  </div>
</template>

标签: 规格商品
分享给朋友:

相关文章

vue实现商品排序

vue实现商品排序

实现商品排序功能 在Vue中实现商品排序功能可以通过计算属性或方法对数据进行处理。以下是一个完整的实现方案,包含价格、销量和综合排序三种常见方式。 数据准备 假设商品数据存储在goodsList数…

Vue实现商品详情

Vue实现商品详情

Vue实现商品详情页的方法 数据获取与渲染 使用Vue的data属性存储商品详情数据,通过v-for指令循环渲染商品属性列表。结合v-if或v-show控制图片预览、库存状态等动态显示。 data…

vue实现商品详解

vue实现商品详解

Vue 实现商品详情页功能 技术栈选择 Vue 3 + Vue Router + Pinia(状态管理)+ Axios(数据请求)+ Element UI/Vant(可选UI库) 核心功能模块…

vue实现商品卡片

vue实现商品卡片

Vue 实现商品卡片 在 Vue 中实现商品卡片可以通过组件化的方式完成,以下是一个完整的实现方案: 商品卡片组件 <template> <div class="product…

vue实现京东规格

vue实现京东规格

Vue 实现京东规格选择功能 京东规格选择功能通常用于商品详情页,允许用户选择不同规格(如颜色、尺寸等)并实时更新价格和库存状态。以下是基于 Vue 的实现方法。 数据结构和组件设计 数据结构…

vue实现商品累加

vue实现商品累加

Vue实现商品累加功能 商品累加功能通常用于购物车或商品列表,允许用户增减商品数量。以下是实现方法: 数据绑定与基础累加 在Vue组件中定义商品数据,使用v-model绑定数量输入框: dat…