sku 应分三层组织:specs 描述规格项,skus 存储合法组合及库存,spec_value_ids 用约定字符串格式标识;禁用逻辑需每次重算可用值集合;uni-app 中须节流 onreachbottom 并降级 array.find 为 for 循环。

SKU 数据结构怎么组织才不翻车
商品多规格本质是「属性组合 + 库存约束」,不是简单套个二维数组。常见翻车点:把 specs 和 skus 混在一起处理,导致选中逻辑错乱、库存判断失效。
正确做法是严格分离三层:
-
specs:描述规格项,如[{name: "颜色", values: ["红","蓝"]}, {name: "尺寸", values: ["S","M"}] -
skus:所有合法组合及其库存,每个含唯一id和stock,例如{id: "1001", spec_value_ids: ["red", "s"], stock: 5} -
spec_value_ids必须和后端约定好字符串格式(推荐用"color:red|size:s"或数组哈希),不能靠前端拼接顺序推断
如果后端返回的是扁平 sku_list 数组但没带明确的规格映射关系,立刻要求补字段——靠前端硬解析 spec_str 字段极易出错。
点击规格值时如何实时禁用无效选项
禁用逻辑不是“当前已选规格下找剩余组合”,而是“排除掉所有不含当前点击值的 SKU 后,看其他规格还有哪些值被完全覆盖”。这个计算必须每次点击都重算,不能缓存中间状态。
关键步骤:
- 先收集当前已选规格构成的 key,比如
"color:red" - 筛选出所有包含该 key 的
skus(即sku.spec_value_ids.includes("color:red")) - 对每个未选规格(如 "尺寸"),提取这些 SKU 中出现过的所有
size值,得到可用集合 - 把不在该集合里的规格值设为 disabled
注意:uni-app 的 v-for 绑定数组不能直接改 disabled 属性,得用 computed 或 watch 生成带 disabled 字段的新数组,否则视图不更新。
uni-app 中 onReachBottom 触发太频繁怎么办
这不是 SKU 逻辑问题,但实际开发中常因列表页嵌套 SKU 选择器,滚动到底部时疯狂触发加载,导致重复请求或状态错乱。
根本原因是 onReachBottom 在某些机型/版本下会连续触发多次,尤其配合下拉刷新或页面高度变化时。
- 加节流:用
setTimeout+ 标志位,500ms 内只执行一次 - 检查是否真到底部:
uni.createSelectorQuery().select("#list").boundingClientRect()拿到容器高度和 scrollTop,比对真实位置 - 更稳妥的做法是监听
scrolltoupper事件并绑定在 scroll-view 上,比页面级onReachBottom更可控
别信“uni-app 自带防抖”,它只管触发时机,不管业务逻辑是否重复执行。
微信小程序真机调试时 Array.find 报错
部分低端安卓机或旧版微信客户端不支持 ES2015+ 方法,Array.find、Array.some 在真机上直接报 undefined is not a function。
解决方案不是加 babel 插件(uni-app 默认不转译 node_modules),而是手动降级:
- 用
for循环替代find:let found = null;<br>for (let i = 0; i if (arr[i].id === targetId) {<br> found = arr[i];<br> break;<br> }<br>} - 或者封装一个兼容函数:
const find = (arr, fn) => { for (let i = 0; i - 千万别用
filter()[0],性能差且语义错误
这个问题在模拟器里永远不暴露,必须真机连调试器看 console 才能发现。
SKU 联动最麻烦的从来不是选中高亮,而是「库存归零后要不要清空已选」「不同规格是否允许部分缺货」「用户反复切换时如何保持操作直觉」——这些边界没写进需求文档,但上线后第一个被客服打爆电话。









