vant 2.13.8 → 2.13.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/sku/Sku.js CHANGED
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  exports.__esModule = true;
6
6
  exports.default = void 0;
7
7
 
8
- var _extends5 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
8
+ var _extends3 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
 
10
10
  var _vue = _interopRequireDefault(require("vue"));
11
11
 
@@ -170,7 +170,6 @@ var _default2 = createComponent({
170
170
  value: function value(val) {
171
171
  this.show = val;
172
172
  },
173
- skuTree: 'resetSelectedSku',
174
173
  initialSku: function initialSku() {
175
174
  this.resetStepper();
176
175
  this.resetSelectedSku();
@@ -268,7 +267,13 @@ var _default2 = createComponent({
268
267
  return this.sku.origin_price;
269
268
  },
270
269
  skuTree: function skuTree() {
271
- return this.sku.tree || [];
270
+ var originTree = this.sku.tree || []; // 避免不必要的重复计算
271
+
272
+ if (!originTree.length || !this.skuList.length) {
273
+ return originTree;
274
+ }
275
+
276
+ return (0, _skuHelper.filterDisabledSkuTree)(originTree, this.skuList, this.selectedSku);
272
277
  },
273
278
  skuList: function skuList() {
274
279
  return this.sku.list || [];
@@ -390,7 +395,16 @@ var _default2 = createComponent({
390
395
  resetSelectedSku: function resetSelectedSku() {
391
396
  var _this3 = this;
392
397
 
393
- this.selectedSku = {}; // 重置 selectedSku
398
+ this.selectedSku = {}; // 检查initialSku中指定的值是否全部被禁用
399
+
400
+ var initialSkuDisabled = this.checkInitialSkuDisabled(); // 如果initialSku中的值全部被禁用,直接返回空选择
401
+
402
+ if (initialSkuDisabled) {
403
+ // 重置商品属性
404
+ this.resetSelectedProp();
405
+ return;
406
+ } // 重置 selectedSku
407
+
394
408
 
395
409
  this.skuTree.forEach(function (item) {
396
410
  _this3.selectedSku[item.k_s] = _constants.UNSELECTED_SKU_VALUE_ID;
@@ -404,7 +418,18 @@ var _default2 = createComponent({
404
418
  key: key,
405
419
  valueId: valueId
406
420
  })) {
407
- _this3.selectedSku[key] = valueId;
421
+ // 检查是否有对应的非禁用SKU
422
+ var skusWithThisValue = _this3.skuList.filter(function (sku) {
423
+ return String(sku[key]) === String(valueId);
424
+ });
425
+
426
+ var hasNonDisabledSku = skusWithThisValue.some(function (sku) {
427
+ return sku.disable_status !== 1;
428
+ });
429
+
430
+ if (hasNonDisabledSku) {
431
+ _this3.selectedSku[key] = valueId;
432
+ }
408
433
  }
409
434
  });
410
435
  var skuValues = this.selectedSkuValues;
@@ -417,8 +442,51 @@ var _default2 = createComponent({
417
442
  selectedSkuComb: _this3.selectedSkuComb
418
443
  });
419
444
  });
420
- } // 重置商品属性
445
+ }
446
+
447
+ this.resetSelectedProp(); // 抛出重置事件
448
+
449
+ this.$emit('sku-reset', {
450
+ selectedSku: this.selectedSku,
451
+ selectedProp: this.selectedProp,
452
+ selectedSkuComb: this.selectedSkuComb
453
+ });
454
+ this.centerInitialSku();
455
+ },
456
+ // 检查initialSku中指定的值是否全部被禁用
457
+ checkInitialSkuDisabled: function checkInitialSkuDisabled() {
458
+ var _this4 = this;
459
+
460
+ // 如果没有initialSku或者没有skuList,则不进行检查
461
+ if ((0, _utils.isEmpty)(this.initialSku) || !this.skuList.length) {
462
+ return false;
463
+ } // 只关注 s1 到 s5 的规格键
464
+
465
+
466
+ var skuKeys = ['s1', 's2', 's3', 's4', 's5']; // 获取initialSku中有效的规格项
467
+
468
+ var initialSkuKeys = skuKeys.filter(function (key) {
469
+ return _this4.initialSku[key] !== undefined && _this4.initialSku[key] !== _constants.UNSELECTED_SKU_VALUE_ID && _this4.initialSku[key] !== '';
470
+ }); // 如果没有有效的规格项,则不进行检查
471
+
472
+ if (!initialSkuKeys.length) {
473
+ return false;
474
+ } // 查找符合initialSku的所有sku组合
475
+
476
+
477
+ var matchedSkus = this.skuList.filter(function (sku) {
478
+ return initialSkuKeys.every(function (key) {
479
+ return String(sku[key]) === String(_this4.initialSku[key]);
480
+ });
481
+ }); // 如果没有匹配的sku或者所有匹配的sku都被禁用,则返回true
421
482
 
483
+ return !matchedSkus.length || matchedSkus.every(function (sku) {
484
+ return sku.disable_status === 1;
485
+ });
486
+ },
487
+ // 重置商品属性
488
+ resetSelectedProp: function resetSelectedProp() {
489
+ var _this5 = this;
422
490
 
423
491
  this.selectedProp = {};
424
492
  var _this$initialSku$sele = this.initialSku.selectedProp,
@@ -426,7 +494,7 @@ var _default2 = createComponent({
426
494
 
427
495
  this.propList.forEach(function (item) {
428
496
  if (selectedProp[item.k_id]) {
429
- _this3.selectedProp[item.k_id] = selectedProp[item.k_id];
497
+ _this5.selectedProp[item.k_id] = selectedProp[item.k_id];
430
498
  }
431
499
  });
432
500
 
@@ -450,7 +518,7 @@ var _default2 = createComponent({
450
518
  });
451
519
 
452
520
  if (firstEnableProp) {
453
- _this3.selectedProp[k_id] = [firstEnableProp.id];
521
+ _this5.selectedProp[k_id] = [firstEnableProp.id];
454
522
  }
455
523
  }
456
524
  }
@@ -465,15 +533,7 @@ var _default2 = createComponent({
465
533
  selectedProp: this.selectedProp,
466
534
  selectedSkuComb: this.selectedSkuComb
467
535
  });
468
- } // 抛出重置事件
469
-
470
-
471
- this.$emit('sku-reset', {
472
- selectedSku: this.selectedSku,
473
- selectedProp: this.selectedProp,
474
- selectedSkuComb: this.selectedSkuComb
475
- });
476
- this.centerInitialSku();
536
+ }
477
537
  },
478
538
  getSkuMessages: function getSkuMessages() {
479
539
  return this.$refs.skuMessages ? this.$refs.skuMessages.getMessages() : {};
@@ -502,27 +562,39 @@ var _default2 = createComponent({
502
562
  return t('selectSku');
503
563
  },
504
564
  onSelect: function onSelect(skuValue) {
505
- var _extends2, _extends3;
565
+ var _this6 = this;
506
566
 
507
567
  // 点击已选中的sku时则取消选中
508
- this.selectedSku = this.selectedSku[skuValue.skuKeyStr] === skuValue.id ? (0, _extends5.default)({}, this.selectedSku, (_extends2 = {}, _extends2[skuValue.skuKeyStr] = _constants.UNSELECTED_SKU_VALUE_ID, _extends2)) : (0, _extends5.default)({}, this.selectedSku, (_extends3 = {}, _extends3[skuValue.skuKeyStr] = skuValue.id, _extends3)); // 切换sku清空当前选择属性数据,触发prop-clear
568
+ var newSelectedSku = (0, _extends3.default)({}, this.selectedSku);
569
+
570
+ if (newSelectedSku[skuValue.skuKeyStr] === skuValue.id) {
571
+ newSelectedSku[skuValue.skuKeyStr] = _constants.UNSELECTED_SKU_VALUE_ID;
572
+ } else {
573
+ newSelectedSku[skuValue.skuKeyStr] = skuValue.id;
574
+ } // 使用 Vue.set 来确保正确触发响应式更新
575
+
576
+
577
+ this.selectedSku = newSelectedSku; // 切换sku清空当前选择属性数据,触发prop-clear
509
578
 
510
579
  if (this.isSkuProperties) {
511
580
  this.selectedProp = {};
512
581
  this.onPropClear();
513
- }
582
+ } // 使用 $nextTick 等待 DOM 更新后再触发事件
514
583
 
515
- this.$emit('sku-selected', {
516
- skuValue: skuValue,
517
- selectedSku: this.selectedSku,
518
- selectedSkuComb: this.selectedSkuComb
584
+
585
+ this.$nextTick(function () {
586
+ _this6.$emit('sku-selected', {
587
+ skuValue: skuValue,
588
+ selectedSku: _this6.selectedSku,
589
+ selectedSkuComb: _this6.selectedSkuComb
590
+ });
519
591
  });
520
592
  },
521
593
  onPropClear: function onPropClear() {
522
594
  this.$emit('sku-prop-clear');
523
595
  },
524
596
  onPropSelect: function onPropSelect(propValue) {
525
- var _extends4;
597
+ var _extends2;
526
598
 
527
599
  var arr = this.selectedProp[propValue.skuKeyStr] || [];
528
600
  var pos = arr.indexOf(propValue.id);
@@ -535,7 +607,7 @@ var _default2 = createComponent({
535
607
  arr.splice(0, 1, propValue.id);
536
608
  }
537
609
 
538
- this.selectedProp = (0, _extends5.default)({}, this.selectedProp, (_extends4 = {}, _extends4[propValue.skuKeyStr] = arr, _extends4));
610
+ this.selectedProp = (0, _extends3.default)({}, this.selectedProp, (_extends2 = {}, _extends2[propValue.skuKeyStr] = arr, _extends2));
539
611
  this.$emit('sku-prop-selected', {
540
612
  propValue: propValue,
541
613
  selectedProp: this.selectedProp,
@@ -546,7 +618,7 @@ var _default2 = createComponent({
546
618
  this.selectedNum = num;
547
619
  },
548
620
  onPreviewImage: function onPreviewImage(selectedValue) {
549
- var _this4 = this;
621
+ var _this7 = this;
550
622
 
551
623
  var imageList = this.imageList;
552
624
  var index = 0;
@@ -564,7 +636,7 @@ var _default2 = createComponent({
564
636
  indexImage = selectedValue.imgUrl;
565
637
  }
566
638
 
567
- var params = (0, _extends5.default)({}, selectedValue, {
639
+ var params = (0, _extends3.default)({}, selectedValue, {
568
640
  index: index,
569
641
  imageList: this.imageList,
570
642
  indexImage: indexImage
@@ -579,7 +651,7 @@ var _default2 = createComponent({
579
651
  images: this.imageList,
580
652
  startPosition: index,
581
653
  onClose: function onClose() {
582
- _this4.$emit('close-preview', params);
654
+ _this7.$emit('close-preview', params);
583
655
  }
584
656
  });
585
657
  },
@@ -614,7 +686,7 @@ var _default2 = createComponent({
614
686
  }
615
687
  },
616
688
  onStepperState: function onStepperState(data) {
617
- this.stepperError = data.valid ? null : (0, _extends5.default)({}, data, {
689
+ this.stepperError = data.valid ? null : (0, _extends3.default)({}, data, {
618
690
  action: 'plus'
619
691
  });
620
692
  },
@@ -653,18 +725,18 @@ var _default2 = createComponent({
653
725
  this.centerInitialSku();
654
726
  },
655
727
  centerInitialSku: function centerInitialSku() {
656
- var _this5 = this;
728
+ var _this8 = this;
657
729
 
658
730
  (this.$refs.skuRows || []).forEach(function (it) {
659
731
  var _ref = it.skuRow || {},
660
732
  k_s = _ref.k_s;
661
733
 
662
- it.centerItem(_this5.initialSku[k_s]);
734
+ it.centerItem(_this8.initialSku[k_s]);
663
735
  });
664
736
  }
665
737
  },
666
738
  render: function render() {
667
- var _this6 = this;
739
+ var _this9 = this;
668
740
 
669
741
  var h = arguments[0];
670
742
 
@@ -696,7 +768,7 @@ var _default2 = createComponent({
696
768
  };
697
769
 
698
770
  var slots = function slots(name) {
699
- return _this6.slots(name, slotsProps);
771
+ return _this9.slots(name, slotsProps);
700
772
  };
701
773
 
702
774
  var Header = slots('sku-header') || h(_SkuHeader.default, {
@@ -778,7 +850,7 @@ var _default2 = createComponent({
778
850
  },
779
851
  "on": {
780
852
  "change": function change(event) {
781
- _this6.$emit('stepper-change', event);
853
+ _this9.$emit('stepper-change', event);
782
854
  }
783
855
  }
784
856
  });
@@ -812,9 +884,9 @@ var _default2 = createComponent({
812
884
  "opened": this.onOpened
813
885
  },
814
886
  "model": {
815
- value: _this6.show,
887
+ value: _this9.show,
816
888
  callback: function callback($$v) {
817
- _this6.show = $$v;
889
+ _this9.show = $$v;
818
890
  }
819
891
  }
820
892
  }, [Header, h("div", {
@@ -3,7 +3,7 @@
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
5
  exports.__esModule = true;
6
- exports.default = exports.getSelectedProperties = exports.getSelectedPropValues = exports.isSkuChoosable = exports.getSelectedSkuValues = exports.getSkuComb = exports.isAllSelected = exports.normalizePropList = exports.normalizeSkuTree = void 0;
6
+ exports.default = exports.getSelectedProperties = exports.getSelectedPropValues = exports.filterDisabledSkuTree = exports.isSkuChoosable = exports.getSelectedSkuValues = exports.getSkuComb = exports.isAllSelected = exports.normalizePropList = exports.normalizeSkuTree = void 0;
7
7
 
8
8
  var _extends3 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
9
 
@@ -126,16 +126,136 @@ var isSkuChoosable = function isSkuChoosable(skuList, selectedSku, skuToChoose)
126
126
  return skusToCheck.every(function (skuKey) {
127
127
  return String(matchedSku[skuKey]) === String(sku[skuKey]);
128
128
  });
129
+ }); // 检查是否有非禁用的SKU可选
130
+
131
+ var availableSku = filteredSku.filter(function (sku) {
132
+ return sku.disable_status !== 1;
129
133
  });
130
- var stock = filteredSku.reduce(function (total, sku) {
134
+ var stock = availableSku.reduce(function (total, sku) {
131
135
  total += sku.stock_num;
132
136
  return total;
133
137
  }, 0);
134
138
  return stock > 0;
135
- };
139
+ }; // 根据disable_status字段过滤skuTree
140
+
136
141
 
137
142
  exports.isSkuChoosable = isSkuChoosable;
138
143
 
144
+ var filterDisabledSkuTree = function filterDisabledSkuTree(skuTree, skuList, selectedSku) {
145
+ if (selectedSku === void 0) {
146
+ selectedSku = {};
147
+ }
148
+
149
+ if (!(skuList == null ? void 0 : skuList.length)) {
150
+ return skuTree;
151
+ } // 创建规格树的深拷贝,避免修改原始数据
152
+
153
+
154
+ var treeClone = JSON.parse(JSON.stringify(skuTree)); // 对每个规格值,收集所有包含它的SKU
155
+
156
+ var specValueToSkus = {}; // 初始化规格值到SKU的映射
157
+
158
+ treeClone.forEach(function (treeItem) {
159
+ var key = treeItem.k_s;
160
+ treeItem.v.forEach(function (value) {
161
+ var valueId = value.id;
162
+ specValueToSkus[key + "-" + valueId] = [];
163
+ });
164
+ }); // 收集每个规格值对应的所有SKU
165
+
166
+ skuList.forEach(function (item) {
167
+ for (var i = 1; i <= 5; i++) {
168
+ var key = "s" + i;
169
+ var value = item[key];
170
+
171
+ if (value && value !== '0') {
172
+ var mapKey = key + "-" + value;
173
+
174
+ if (specValueToSkus[mapKey]) {
175
+ specValueToSkus[mapKey].push(item);
176
+ }
177
+ }
178
+ }
179
+ }); // 过滤规格树
180
+
181
+ return treeClone.filter(function (treeItem) {
182
+ var key = treeItem.k_s;
183
+ var isSelectedSpec = selectedSku[key] && selectedSku[key] !== _constants.UNSELECTED_SKU_VALUE_ID; // 过滤规格值
184
+
185
+ treeItem.v = treeItem.v.filter(function (value) {
186
+ var valueId = value.id;
187
+ var mapKey = key + "-" + valueId;
188
+ var relatedSkus = specValueToSkus[mapKey] || []; // 1. 如果所有包含该规格值的SKU都被明确禁用,则过滤掉该规格值
189
+
190
+ if (relatedSkus.length > 0) {
191
+ var allExplicitlyDisabled = relatedSkus.every(function (sku) {
192
+ return sku.disable_status === 1;
193
+ });
194
+
195
+ if (allExplicitlyDisabled) {
196
+ return false;
197
+ }
198
+ } // 2. 如果是已选中的值,保留它
199
+
200
+
201
+ if (isSelectedSpec && String(valueId) === String(selectedSku[key])) {
202
+ return true;
203
+ } // 3. 如果用户已经选择了其他规格,检查组合
204
+
205
+
206
+ var validSelectedEntries = Object.entries(selectedSku).filter(function (_ref) {
207
+ var selectedKey = _ref[0],
208
+ val = _ref[1];
209
+ return val !== _constants.UNSELECTED_SKU_VALUE_ID && selectedKey !== key;
210
+ } // 排除当前规格
211
+ );
212
+
213
+ if (validSelectedEntries.length > 0) {
214
+ // 创建当前组合
215
+ var combinedSelection = {}; // 添加已选规格
216
+
217
+ validSelectedEntries.forEach(function (_ref2) {
218
+ var selectedKey = _ref2[0],
219
+ val = _ref2[1];
220
+ combinedSelection[selectedKey] = val;
221
+ }); // 添加当前正在检查的规格值
222
+
223
+ combinedSelection[key] = String(valueId); // 查找满足当前组合的SKU
224
+
225
+ var matchingSku = skuList.filter(function (sku) {
226
+ return Object.entries(combinedSelection).every(function (_ref3) {
227
+ var selectedKey = _ref3[0],
228
+ selectedVal = _ref3[1];
229
+ return String(sku[selectedKey]) === String(selectedVal);
230
+ });
231
+ }); // 如果有匹配的SKU,检查它们是否全部被禁用
232
+
233
+ if (matchingSku.length > 0) {
234
+ var allDisabled = matchingSku.every(function (sku) {
235
+ return sku.disable_status === 1;
236
+ });
237
+ return !allDisabled;
238
+ }
239
+ } // 默认保留所有规格值
240
+
241
+
242
+ return true;
243
+ }); // 如果是已选中的规格项,但过滤后没有包含已选值,则隐藏
244
+
245
+ if (isSelectedSpec) {
246
+ var selectedValueExists = treeItem.v.some(function (value) {
247
+ return String(value.id) === String(selectedSku[key]);
248
+ });
249
+ return selectedValueExists;
250
+ } // 如果该规格项下没有规格值了,则隐藏整个规格项
251
+
252
+
253
+ return treeItem.v.length > 0;
254
+ });
255
+ };
256
+
257
+ exports.filterDisabledSkuTree = filterDisabledSkuTree;
258
+
139
259
  var getSelectedPropValues = function getSelectedPropValues(propList, selectedProp) {
140
260
  var normalizeProp = normalizePropList(propList);
141
261
  return Object.keys(selectedProp).reduce(function (acc, cur) {
@@ -174,6 +294,7 @@ var _default = {
174
294
  isAllSelected: isAllSelected,
175
295
  isSkuChoosable: isSkuChoosable,
176
296
  getSelectedPropValues: getSelectedPropValues,
177
- getSelectedProperties: getSelectedProperties
297
+ getSelectedProperties: getSelectedProperties,
298
+ filterDisabledSkuTree: filterDisabledSkuTree
178
299
  };
179
300
  exports.default = _default;