当前位置:首页 > VUE

vue实现sku算法

2026-02-18 19:46:05VUE

Vue 实现 SKU 算法

SKU(Stock Keeping Unit)算法用于处理商品的多规格组合选择,常见于电商平台。以下是基于 Vue 的实现方法:

数据结构设计

商品规格通常分为多个维度(如颜色、尺寸),每个维度有多个选项。数据结构示例:

vue实现sku算法

data() {
  return {
    specs: [
      {
        name: '颜色',
        values: ['红色', '蓝色']
      },
      {
        name: '尺寸',
        values: ['S', 'M']
      }
    ],
    skus: [
      { id: 1, specs: ['红色', 'S'], stock: 10 },
      { id: 2, specs: ['红色', 'M'], stock: 5 }
    ]
  }
}

核心算法实现

  1. 初始化选择状态
data() {
  return {
    selected: this.specs.map(spec => null) // 初始化为未选择
  }
}
  1. 计算可选状态

根据已选规格和库存数据,计算每个规格是否可选:

computed: {
  specStatus() {
    return this.specs.map((spec, specIndex) => {
      return spec.values.map(value => {
        // 临时构建当前选择路径
        const tempSelected = [...this.selected]
        tempSelected[specIndex] = value

        // 检查是否有匹配的SKU
        return this.skus.some(sku => {
          return tempSelected.every((sel, i) => 
            sel === null || sku.specs[i] === sel
          ) && sku.stock > 0
        })
      })
    })
  }
}
  1. 渲染规格选择器

模板中使用计算属性控制按钮状态:

vue实现sku算法

<div v-for="(spec, specIndex) in specs" :key="spec.name">
  <h3>{{ spec.name }}</h3>
  <button
    v-for="(value, valueIndex) in spec.values"
    :key="value"
    :disabled="!specStatus[specIndex][valueIndex]"
    @click="selectSpec(specIndex, value)"
    :class="{ active: selected[specIndex] === value }"
  >
    {{ value }}
  </button>
</div>
  1. 选择规格方法
methods: {
  selectSpec(specIndex, value) {
    this.$set(this.selected, specIndex, 
      this.selected[specIndex] === value ? null : value
    )
  }
}

完整选择判断

添加计算属性判断是否已选择完整规格组合:

computed: {
  isCompleteSelection() {
    return this.selected.every(s => s !== null)
  },
  selectedSku() {
    if (!this.isCompleteSelection) return null
    return this.skus.find(sku => 
      sku.specs.every((spec, i) => spec === this.selected[i])
    )
  }
}

优化性能

对于大量SKU的情况,可以使用字典优化查找:

created() {
  this.skuMap = this.skus.reduce((map, sku) => {
    map[sku.specs.join('|')] = sku
    return map
  }, {})
}

// 在specStatus中使用skuMap优化查找

完整示例组件

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

    <div v-if="isCompleteSelection">
      <p>已选择:{{ selected.join(', ') }}</p>
      <p v-if="selectedSku">库存:{{ selectedSku.stock }}</p>
      <p v-else>该组合无货</p>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      specs: [], // 从API获取
      skus: [],  // 从API获取
      selected: [],
      skuMap: {}
    }
  },
  computed: {
    specStatus() {
      // ...同上实现
    },
    isCompleteSelection() {
      // ...同上实现
    },
    selectedSku() {
      // ...同上实现
    }
  },
  methods: {
    selectSpec(specIndex, value) {
      // ...同上实现
    }
  },
  created() {
    // 初始化skuMap
    // ...同上实现
  }
}
</script>

注意事项

  1. 后端API应返回规格和SKU的完整数据
  2. 对于复杂商品,考虑分步加载规格数据
  3. 可添加规格图片支持
  4. 移动端需优化交互样式
  5. 考虑添加规格不可选时的提示信息

该实现涵盖了SKU算法的核心逻辑,包括规格选择联动、库存状态判断和完整选择验证,可根据实际需求进行扩展。

标签: 算法vue
分享给朋友:

相关文章

vue无限菜单怎么实现

vue无限菜单怎么实现

实现 Vue 无限菜单的方法 递归组件实现嵌套菜单 使用 Vue 的递归组件特性可以轻松实现无限级嵌套菜单。通过组件调用自身的方式处理嵌套数据。 <template> <ul&…

vue实现点击

vue实现点击

实现点击事件的基本方法 在Vue中实现点击事件可以通过v-on指令或@简写方式绑定。以下是常见的点击事件绑定方法: <template> <button v-on:click=…

vue插件实现

vue插件实现

Vue 插件实现方法 Vue 插件是一种向 Vue 应用程序添加全局功能的机制。插件可以包含全局指令、过滤器、混入、实例方法等。 插件的基本结构 一个 Vue 插件通常是一个对象或函数,需要暴露一个…

vue实现ios

vue实现ios

Vue 实现 iOS 风格应用 使用 Vue 实现 iOS 风格的应用,可以通过结合 UI 框架和自定义样式来达成目标。以下是具体方法和步骤: 选择 iOS 风格的 UI 框架 Vue 生态中有多…

vue实现groupbox

vue实现groupbox

Vue 实现 GroupBox 组件 在 Vue 中实现类似 GroupBox 的效果可以通过自定义组件完成。GroupBox 通常是一个带有标题的边框容器,用于将相关控件分组显示。 基本实现方法…

vue实现标注

vue实现标注

Vue 实现标注功能的方法 使用 Vue 实现标注功能可以通过多种方式实现,以下介绍几种常见的方法: 1. 使用 HTML5 Canvas 实现标注 Canvas 提供了强大的绘图能力,适合实现复…