SKU 原理(代码干货)
sku大体来讲就是循环递归来进行的一种选择,将后端返回的接口里的数据,进行递归遍历,并进行判断,可以说sku是一种算法,也可以说sku是一种规格,通过递归遍历出来最后所要呈现在页面的一种规格。
- 页面初始数据
/**
* 页面的初始数据
*/
data: {
shopId: 1,
picDomain: config.picDomain,
indicatorDots: true,
indicatorColor: '#f2f2f2',
indicatorActiveColor: '#eb2444',
autoplay: true,
interval: 3000,
duration: 1000,
prodNum: 1,
totalCartNum: 0,
pic: "",
imgs: '',
prodName: '',
price: 0,
content: '',
prodId: 0,
brief: '',
skuId: 0,
popupShow: false,
// 是否获取过用户领取过的优惠券id
loadCouponIds: false,
skuShow: false,
commentShow: false,
couponList: [],
skuList: [],
skuGroup: {},
findSku: true,
defaultSku: undefined,
selectedProp: [],
selectedPropObj: {},
propKeys: [],
allProperties: [],
prodCommData: {},
prodCommPage: {
current: 0,
pages: 0,
records: []
},
littleCommPage: [],
evaluate: -1,
isCollection: false
},
主要是设置要进行使用或者是创建的sku的初始值
- 获取后端接口发送给来的数据
getProdInfo() {
wx.showLoading();
var params = {
url: "/xxxx/xxxxxx",
method: "GET",
data: {
prodId: this.data.prodId,
},
//重新获取并赋值
this.setData({
imgs: imgs,
content: content,
price: res.price,
prodName: res.prodName,
prodId: res.prodId,
brief: res.brief,
// skuId: res.skuId
skuList: res.skuList,
pic: res.pic
});
// 组装sku
this.groupSkuProp();
3.根据skulist(现目前skulist里的数据是后台传过来的所有数据)进行数据组装
var skuList = this.data.skuList;
//开始条件的判断
//当后台返回只有一个SKU时,且SKU属性值为空时,即该商品没有规格选项,该SKU直接作为默认选中SKU
if (skuList.length == 1 && skuList[0].properties == "") {
this.setData({
defaultSku: skuList[0]
});
return;
}
4.分别创建规格集合,并进行存放
var skuGroup = {};//所有的规格名(包含规格名下的规格值集合)对象,如 {"颜色":["金色","银色"],"内存":["64G","256G"]}
var allProperties = [];//所有SKU的属性值集合,如 ["颜色:金色;内存:64GB","颜色:银色;内存:64GB"]
var propKeys = [];//所有的规格名集合,如 ["颜色","内存"]
5.进行循环判断并进行重新赋值
for (var i = 0; i < skuList.length; i++) {
//找到和商品价格一样的那个SKU,作为默认选中的SKU
var defaultSku = this.data.defaultSku;
var isDefault = false;
if (!defaultSku && skuList[i].price == this.data.price) {
defaultSku = skuList[i];
isDefault = true;
this.setData({
defaultSku: defaultSku
});
}
var properties = skuList[i].properties; //如:版本:公开版;颜色:金色;内存:64GB
allProperties.push(properties);
var propList = properties.split(";"); // 如:["版本:公开版","颜色:金色","内存:64GB"]
var selectedPropObj = this.data.selectedPropObj;
for (var j = 0; j < propList.length; j++) {
var propval = propList[j].split(":"); //如 ["版本","公开版"]
var props = skuGroup[propval[0]]; //先取出 规格名 对应的规格值数组
//如果当前是默认选中的sku,把对应的属性值 组装到selectedProp
if (isDefault) {
propKeys.push(propval[0]);
selectedPropObj[propval[0]] = propval[1];
}
if (props == undefined) {
props = []; //假设还没有版本,新建个新的空数组
props.push(propval[1]); //把 "公开版" 放进空数组
} else {
if (!this.array_contain(props, propval[1])) { //如果数组里面没有"公开版"
props.push(propval[1]); //把 "公开版" 放进数组
}
}
skuGroup[propval[0]] = props; //最后把数据 放回版本对应的值
}
this.setData({
selectedPropObj: selectedPropObj,
propKeys: propKeys
});
}
6.最后对遍历出来的值进行拆分,转换,并重新赋值
//将已选的 {key:val,key2:val2}转换成 [val,val2]
parseSelectedObjToVals: function() {
var selectedPropObj = this.data.selectedPropObj;
var selectedProperties = "";
var selectedProp = [];
for (var key in selectedPropObj) {
selectedProp.push(selectedPropObj[key]);
selectedProperties += key + ":" + selectedPropObj[key] + ";";
}
selectedProperties = selectedProperties.substring(0, selectedProperties.length - 1);
this.setData({
selectedProp: selectedProp
});
var findSku = false;
for (var i = 0; i < this.data.skuList.length; i++) {
if (this.data.skuList[i].properties == selectedProperties) {
findSku = true;
this.setData({
defaultSku: this.data.skuList[i],
});
break;
}
}
this.setData({
findSku: findSku
});
},