计算属性不生成矩阵,而是高效驱动矩阵构建与响应式更新;通过解耦规格结构、sku数据和用户选择,自动推导可用组合、禁用状态及匹配sku,并统一输出库存、价格等状态。

计算属性本身不生成矩阵,而是高效驱动矩阵的构建与响应式更新。关键在于把规格结构、SKU数据和用户选择三者解耦,再用计算属性自动推导出可用组合、禁用状态和当前匹配项。
规格结构需分层建模
不要直接操作扁平 SKU 列表。先定义清晰的规格层级:
- 规格组(如“颜色”“尺码”“套餐”),每个含 attrNameId 和 attrValues 数组
- SKU 列表中每个元素带 skuAttrList,是键值对数组,例如[{attrName: "颜色", attrValue: "红"}, {attrName: "尺码", attrValue: "XL"}]
- 在 Vue/React 状态中维护 selectedSpecs 对象,如 { 颜色: "红", 尺码: "XL" }
用计算属性生成规格交叉矩阵
所谓“SKU 矩阵”,本质是规格值之间的可达性关系。可借助二维布尔矩阵表达:行=某规格的所有取值,列=另一规格的所有取值,值为 true 表示存在至少一个 SKU 同时包含这两个值。
- 先提取所有规格维度名,按顺序排列(如 ["颜色", "尺码", "套餐"])
- 对每一对相邻维度(颜色 × 尺码、尺码 × 套餐),遍历全部 SKU,标记有效组合:matrix[颜色索引][尺码索引] = true
- 该矩阵无需手动维护,由计算属性 specMatrix 自动构建并缓存,依赖 skuList 和 skuAttrSortedList 变化而更新
动态推导可选值与禁用态
用户点击一个规格值后,其他维度哪些还能点,靠计算属性实时过滤,不是硬编码逻辑:
- availableSizes():筛选出与已选颜色 + 已选套餐同时存在的所有尺码(即三者交集非空)
- isDisabled(attr):检查该值是否与 selectedSpecs 中每一项都存在共同 SKU;只要有一维无交集,就返回 true
- 禁用判断可复用同一套矩阵查询逻辑,例如 matrixColorSize[colorIdx][sizeIdx] && matrixSizePackage[sizeIdx][packageIdx]
匹配当前组合并反馈状态
当用户完成选择,系统要立刻回答三个问题:有没有这个组合?能不能买?价格库存是多少?这些全由计算属性统一输出:
- matchedSku:遍历 skuList,找 skuAttrList 完全匹配 selectedSpecs 的项(注意属性名需归一化为 key)
- isInStock:仅当 matchedSku 存在且 skuStatus === 1 且 maxBuyVolume > 0 时为 true
- currentPrice:优先取 salePrice,降级到 originalSalePrice,支持多币种字段联动











