SKU库存联动需用已选规格组合查实时库存,而非依赖选中状态;每次点击后须用selectedValues生成笛卡尔积并过滤stock>0的SKU;禁用状态须动态重算,不可缓存;真机点击失效多因缺少cursor:pointer;数据格式不统一是最大坑点。

uni-app里SKU选择怎么触发库存联动
核心是:不能靠“选中状态”推导库存,得用已选规格组合去查实时库存。很多开发者把selectedSku当成了最终结果,其实它只是中间态——真正影响可选范围的是selectedValues(比如['红色', 'XL'])拼出的唯一key,再拿这个key去匹配skuList里带id和stock的条目。
常见错误现象:
点完颜色还能选尺码,但提交时提示“库存不足”;或者某个尺码明明没货,却依然能点选。
- 必须在每次规格点击后,立刻用当前已选值生成所有可能的规格路径(即笛卡尔积),再过滤出
stock > 0的组合 -
skuList接口返回的数据结构必须含specs字段(数组,如["红色", "XL"]),不能只给个skuCode - 不要缓存“禁用状态”,每次都要重算——因为用户可能退一步修改前面选项,禁用逻辑就变了
uni-app多规格UI如何动态禁用不可选项
不是简单加disabled属性,而是要按“当前已选”+“剩余未选”两个维度交叉计算。比如已选“红色”,那所有不含“红色”的SKU都不参与本次筛选,剩下的SKU里,把出现过的“尺码”值提取出来,就是当前可点的尺码列表。
使用场景:用户先点“XL”,再点“绿色”,此时“红色”按钮应该恢复可用(因为绿色+XL可能无货,但红色+XL有货)。
- 每个规格按钮的
disabled状态由函数isSpecDisabled(specKey, specValue)返回,内部遍历skuList找匹配项 - 注意
specKey是规格名(如"color"),specValue是值(如"红色"),别把两者混成一个字符串比对 - 性能敏感:SKU数量超过200条时,建议用
Map预建索引,键为specKey + ':' + specValue,值为该规格值出现在多少个有库存SKU里
为什么uni-app里this.$nextTick后仍拿不到最新DOM状态
因为SKU交互常涉及多次setData(比如先改selectedValues,再算disabledMap),而$nextTick只保证一次渲染完成。你看到的“禁用没更新”,大概率是第二次状态还没推送到视图。
错误写法:this.selectedValues = [...]; this.$nextTick(() => { this.updateDisabled(); });——这里updateDisabled用的仍是旧的selectedValues快照。
- 必须把依赖状态合并更新:
this.$set(this, 'selectedValues', [...]); this.$set(this, 'disabledMap', this.calcDisabled()); - 或改用
async/await链式调用:await this.$nextTick(); this.disabledMap = this.calcDisabled(); - 调试时打印
JSON.stringify(this.selectedValues),别只看模板里的{{ selectedValues }}——后者可能被Vue懒更新卡住
微信小程序真机上SKU点击区域失效怎么办
不是代码问题,是view标签没设cursor: pointer,导致iOS微信不触发tap事件。H5和安卓模拟器正常,一到iOS真机就点不动。
典型错误:用span包文字做按钮,或view里嵌了text但没给user-select: none,长按直接呼出复制菜单,吞掉点击。
- 所有可点规格项外层
view必须加style="cursor: pointer; -webkit-tap-highlight-color: transparent;" - 内层文字用
text标签时,加selectable="false"属性(uni-app支持) - 避免在
@tap回调里直接操作event.target,改用data-传参,比如:data-key="'color'" :data-value="item.value"
specs字段格式不统一、stock字段类型有时是字符串有时是null、甚至同一个商品两次接口返回的规格顺序都不同——这些才是上线前半夜还在改的点。


















