当前位置:首页 > 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实现商品累加功能 商品累加功能通常用于购物车或商品列表,允许用户增减商品数量。以下是实现方法: 数据绑定与基础累加 在Vue组件中定义商品数据,使用v-model绑定数量输入框: data(…

vue实现商品分页

vue实现商品分页

Vue 实现商品分页的方法 基础分页实现 安装必要的依赖(如axios用于请求数据) npm install axios 创建分页组件模板 <template> <div&g…

vue实现商品列表代码

vue实现商品列表代码

以下是一个基于Vue.js的商品列表实现示例,包含基础功能如数据渲染、分页和筛选: 基础商品列表渲染 <template> <div class="product-list"&…

vue实现商品筛选功能

vue实现商品筛选功能

实现商品筛选功能的方法 在Vue中实现商品筛选功能,可以通过以下步骤完成: 创建筛选组件 使用Vue的单文件组件结构,创建一个独立的筛选组件。组件可以包含价格区间、品牌、类别等筛选条件。 <…

js实现商品展示页

js实现商品展示页

商品展示页的实现 商品展示页通常包含商品列表、图片展示、价格、描述等信息。使用JavaScript可以实现动态加载、排序、筛选等功能。 基础HTML结构 <div id="product-…

vue实现商品列表

vue实现商品列表

Vue 实现商品列表 基本结构搭建 使用 Vue CLI 或 Vite 创建一个新项目,安装必要的依赖。商品列表通常包含以下核心组件: 商品卡片组件(展示图片、名称、价格等) 列表容器组件(排列商品…