当前位置:首页 > 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中实现下拉框的删除功能通常涉及以下步骤: 数据绑定与渲染 在Vue组件中定义数据数组用于存储下拉框选项: data() { return { op…

vue实现muli

vue实现muli

Vue 实现多语言(i18n)支持 在 Vue 项目中实现多语言(i18n)功能,通常使用 vue-i18n 插件。以下是具体实现步骤: 安装 vue-i18n npm install vue-i…

vue实现active

vue实现active

Vue 实现 active 状态的方法 在 Vue 中实现 active 状态可以通过以下几种方式实现,具体取决于使用场景和需求。 使用 v-bind:class 动态绑定类名 通过 v-bind:…

vue实现逻辑

vue实现逻辑

Vue 实现逻辑的核心概念 Vue.js 是一个渐进式 JavaScript 框架,其核心逻辑围绕数据驱动和组件化开发。通过响应式系统、虚拟 DOM 和组件生命周期等机制,Vue 实现了高效的前端开发…

vue observer实现

vue observer实现

Vue Observer 实现原理 Vue 的响应式系统核心是通过 Object.defineProperty(Vue 2)或 Proxy(Vue 3)实现的 Observer 模式。以下是关键实现细…

vue 实现fadeout

vue 实现fadeout

Vue 实现淡出效果 在 Vue 中实现淡出(fade-out)效果可以通过 CSS 过渡或动画结合 Vue 的动态渲染功能完成。以下是几种常见方法: 使用 Vue 过渡(Transition)组件…