前段時間,公司要做“添加商品”業務模塊,這也算是電商業務里面的一個難點了。
令我印象最深的不是什么“組合商品”、“關聯商品”、“關聯單品”,而是商品SKU的組合問題。
這個問題特別有意思,當時雖然大體上組合成功,總是有些小bug解決不了,然后手上又有別的任務就沒仔細研究它。
后來過了一個月,空閑下來專門研究了下,終於把問題解決,有必要記錄下這次體驗。
先看下在業務中的效果(tips: 如看不清可放大瀏覽器)

這個相對來說比較麻煩,還涉及到了下面“屬性圖片”的循環,但關鍵點還是在SKU組合的代碼上面
以下是基於element-ui和vue的精簡版demo代碼:
html:
1 <div>SKU組合demo</div> 2 <div v-for="(v, i) in list" :key="i" class="mt-20"> 3 <b>{{ v.name }}:</b> 4 <el-checkbox-group v-model="checkList[i].list"> 5 <el-checkbox v-for="(k, j) in v.list" :key="j" :label="k" /> 6 </el-checkbox-group> 7 </div> 8 <div class="mt-20"> 9 <el-button type="primary" @click="handleClick">確定</el-button> 10 </div> 11 <div class="mt-20"> 12 <el-tag v-for="(item, index) in skuList" :key="index" style="margin:10px 10px;">{{ item }}</el-tag> 13 </div>
css:
.mt-20 { margin-top: 20px; }
JS:
1 <script> 2 export default { 3 data() { 4 return { 5 list: [ 6 { name: '尺碼', list: ['S', 'M', 'L', 'XL', 'XXL'] }, 7 { name: '顏色', list: ['紅色', '黃色', '藍色', '粉色', '紫色'] }, 8 { name: '圖案', list: ['貓咪', '人物', '飛機', '閃電', '字母'] } 9 ], 10 checkList: [ 11 { name: '尺碼', list: [] }, 12 { name: '顏色', list: [] }, 13 { name: '圖案', list: [] } 14 ], 15 skuArray: [], 16 skuList: [] 17 } 18 }, 19 methods: { 20 handleClick() { 21 // 先清空數據,保證連續點擊按鈕,數據不會重復 22 this.skuArray = [] 23 this.skuList = [] 24 // 將選中的規格組合成一個大數組 [[1, 2], [a, b]...] 25 this.checkList.forEach(element => { 26 element.list.length > 0 ? this.skuArray.push(element.list) : '' 27 }) 28 // 勾選了規格,才調用方法 29 if (this.skuArray.length > 0) { 30 this.getSkuData([], 0, this.skuArray) 31 } else { 32 this.$message.error('請先勾選規格') 33 } 34 }, 35 // 遞歸獲取每條SKU數據 36 getSkuData(skuArr = [], i, list) { 37 for (let j = 0; j < list[i].length; j++) { 38 if (i < list.length - 1) { 39 skuArr[i] = list[i][j] 40 this.getSkuData(skuArr, i + 1, list) // 遞歸循環 41 } else { 42 this.skuList.push([...skuArr, list[i][j]]) // 擴展運算符,連接兩個數組 43 } 44 } 45 } 46 } 47 } 48 </script>
效果如下:

只要是做電商的小伙伴應該都會遇到這個SKU組合問題吧,希望能對大家有所幫助!
如有錯誤,請多指教,謝謝!
