当前位置:首页 > VUE

vue实现sku表格

2026-03-29 13:20:36VUE

Vue 实现 SKU 表格

核心思路

SKU(Stock Keeping Unit)表格通常用于电商商品规格组合展示,需动态生成规格组合矩阵并处理用户选择逻辑。Vue 的响应式特性非常适合此类需求。

vue实现sku表格

数据结构设计

data() {
  return {
    specs: [
      { name: '颜色', values: ['红色', '蓝色', '绿色'] },
      { name: '尺寸', values: ['S', 'M', 'L'] }
    ],
    selected: {},
    skuList: [
      { color: '红色', size: 'S', stock: 10, price: 99 },
      { color: '蓝色', size: 'M', stock: 5, price: 89 }
    ]
  }
}

规格选择处理

methods: {
  handleSelect(specName, value) {
    this.$set(this.selected, specName, value)
    this.checkAvailable()
  },
  checkAvailable() {
    this.specs.forEach(spec => {
      spec.values.forEach(value => {
        const testSelected = { ...this.selected, [spec.name]: value }
        this.$set(spec, 'disabled', !this.isCombinationValid(testSelected))
      })
    })
  },
  isCombinationValid(combination) {
    return this.skuList.some(sku => {
      return Object.keys(combination).every(key => sku[key] === combination[key])
    })
  }
}

表格渲染实现

<template>
  <div class="sku-container">
    <div v-for="spec in specs" :key="spec.name">
      <h3>{{ spec.name }}</h3>
      <button
        v-for="value in spec.values"
        :key="value"
        :class="{ active: selected[spec.name] === value, disabled: spec.disabled }"
        @click="handleSelect(spec.name, value)"
      >
        {{ value }}
      </button>
    </div>

    <table v-if="Object.keys(selected).length > 0">
      <tr>
        <th v-for="spec in specs" :key="spec.name">{{ spec.name }}</th>
        <th>库存</th>
        <th>价格</th>
      </tr>
      <tr v-for="sku in matchedSkus" :key="sku.id">
        <td v-for="spec in specs" :key="spec.name">{{ sku[spec.name.toLowerCase()] }}</td>
        <td>{{ sku.stock }}</td>
        <td>{{ sku.price }}</td>
      </tr>
    </table>
  </div>
</template>

样式优化建议

.sku-container button {
  margin: 5px;
  padding: 8px 12px;
  border: 1px solid #ddd;
  cursor: pointer;
}
.sku-container button.active {
  border-color: #f00;
  background: #ffecec;
}
.sku-container button.disabled {
  opacity: 0.5;
  cursor: not-allowed;
}
table {
  margin-top: 20px;
  border-collapse: collapse;
}
th, td {
  border: 1px solid #ddd;
  padding: 8px;
}

完整逻辑计算

computed: {
  matchedSkus() {
    return this.skuList.filter(sku => {
      return Object.keys(this.selected).every(key => 
        sku[key.toLowerCase()] === this.selected[key]
      )
    })
  }
}

扩展功能建议

  • 添加规格图片展示
  • 实现多规格层级(如三级规格)
  • 加入购物车按钮交互
  • 价格区间计算逻辑
  • 规格组合的禁用状态缓存优化

通过以上实现,可以构建一个完整的SKU选择系统。核心在于通过响应式数据驱动视图更新,利用计算属性处理组合逻辑,通过样式反馈可选状态。

标签: 表格vue
分享给朋友:

相关文章

vue grid实现

vue grid实现

Vue Grid 实现方法 在 Vue 中实现网格布局可以通过多种方式完成,包括使用原生 CSS Grid、第三方组件库或自定义组件。以下是几种常见方法: 使用原生 CSS Grid 通过 Vue…

vue实现标签

vue实现标签

Vue 实现标签的方法 在 Vue 中实现标签功能可以通过多种方式完成,以下是几种常见的方法: 使用动态组件 动态组件可以根据不同的条件渲染不同的标签内容。通过 :is 属性动态绑定组件名,实现标签…

vue 实现列表

vue 实现列表

Vue 实现列表的方法 在 Vue 中实现列表通常使用 v-for 指令,结合数组或对象数据渲染动态列表。以下是几种常见的实现方式: 基础列表渲染 使用 v-for 指令遍历数组,渲染列表项。ite…

vue 实现modal

vue 实现modal

Vue 实现 Modal 的方法 使用 Vue 原生组件 通过 Vue 的组件系统可以轻松实现 Modal。创建一个可复用的 Modal 组件,通过 props 控制显示与隐藏。 <templ…

vue实现座位

vue实现座位

Vue实现座位布局 使用Vue实现座位布局可以通过组件化和响应式数据管理来简化开发流程。以下是一个完整的实现方案: 数据准备 定义座位数据结构,通常使用二维数组表示行列关系: data() {…

vue广播实现

vue广播实现

vue广播实现 在Vue中实现广播功能可以通过事件总线(Event Bus)或Vuex来完成。以下是两种常见的实现方式: 使用事件总线(Event Bus) 事件总线是一种简单的跨组件通信方式,适用…