一、规格组建- SKU&SPU概念
SPU(Standard Product Unit) : 标准化产品单元。通俗点讲,属性值、特性相同的商品就可以称为一个SPU。
SKU(Stock Keeping Unit) 库存量单位,及库存进出计量的单位
二、用到的工具
- js算法库 github.com/trekhleb/ja…
- 幂集算法 raw.githubusercontent.com/trekhleb/ja…
- 完整思路zhoushugang.gitee.io/erabbit-cli…
三、大概思路
// 就是将后端的可选列表每一项都用密集算法求出这一项中所有子集(就是这一项的所有可能性) 存储起来
两种情况
// 1. 初始化
遍历所有的sku项去一个一个匹配 可选列表
// 2. 选中的值
遍历所有的sku项将选中的值+每一个sku中没选中的值 去匹配 可选列表
四、具体实现
// 1. 所有可选值存储起来
let selectableMap = new Map();
function initSelectHandle() {
goodsSelectable.value.forEach((item) => {
//找出有多少可以匹配的规格
const selectableList = bwPowerSet(item.value);
selectableList.forEach((i) => {
let key = i.join('&');
if (!selectableMap.has(key)) {
// 没有key设置一个数组
selectableMap.set(key, item.id);
}
});
});
}
// 2. 组件初始化的时候更新禁用状态
function init() {
goodsAPI.value.forEach((e) => {
e.valueList.forEach((v) => {
v.disabled = !selectableMap.has(v.text);
});
});
}
// 3. 更新按钮的禁用状态
const updateDisabledStatus = () => {
goodsAPI.value.forEach((e, i) => {
// 每次遍历完某一列sku,重新更新选择已经选中的sku的值继续和下一个为选中的sku里的所有值比较
const selectedArr = getSelectedArr();
e.valueList.forEach((v) => {
// 跳过已经选中的禁用状态设置
if (v.text === selectedArr[i]) return false;
// 下一个未选中的每一个值比较
selectedArr[i] = v.text;
const key = selectedArr.filter((v) => v).join('&');
v.disabled = !selectableMap.has(key);
});
});
};