Vue2企业级实战:构建高性能商品SKU选择器组件
一、架构设计原理
基于笛卡尔积算法+虚拟DOM优化+规格状态机的SKU选择器,支持1000+规格组合秒级渲染
二、核心功能实现
1. 规格组合算法
// 计算笛卡尔积 function cartesianProduct(specs) { return specs.reduce((acc, current) => { const ret = [] acc.forEach(a => { current.values.forEach(v => { ret.push([...a, {specId: current.id, valueId: v.id}]) }) }) return ret }, [[]]) } // 生成有效SKU组合 function generateValidCombinations(specs, skus) { const allCombinations = cartesianProduct(specs) return allCombinations.filter(comb => { return skus.some(sku => { return comb.every(c => sku.specs.some(s => s.specId === c.specId && s.valueId === c.valueId ) ) }) }) }
2. 组件核心逻辑
Vue.component('sku-selector', { props: ['specs', 'skus'], data() { return { selected: {}, validCombinations: [] } }, computed: { disabledStates() { // 计算不可选状态 const states = {} this.specs.forEach(spec => { spec.values.forEach(value => { const tempSelected = {...this.selected, [spec.id]: value.id} states[`${spec.id}_${value.id}`] = !this.isCombinationValid(tempSelected) }) }) return states } }, methods: { isCombinationValid(selected) { return this.validCombinations.some(comb => { return Object.entries(selected).every(([specId, valueId]) => comb.some(c => c.specId == specId && c.valueId == valueId) ) }) }, selectSpec(specId, valueId) { this.$set(this.selected, specId, valueId) this.$emit('change', this.selected) } }, created() { this.validCombinations = generateValidCombinations(this.specs, this.skus) } })
3. 性能优化方案
- 计算缓存:记忆函数减少重复计算
- 虚拟滚动:超多规格时优化渲染
- 分批处理:大数据量分片计算
- DOM复用:v-for使用key优化