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/vant.js CHANGED
@@ -19039,12 +19039,129 @@ var sku_helper_isSkuChoosable = function isSkuChoosable(skuList, selectedSku, sk
19039
19039
  return skusToCheck.every(function (skuKey) {
19040
19040
  return String(matchedSku[skuKey]) === String(sku[skuKey]);
19041
19041
  });
19042
+ }); // 检查是否有非禁用的SKU可选
19043
+
19044
+ var availableSku = filteredSku.filter(function (sku) {
19045
+ return sku.disable_status !== 1;
19042
19046
  });
19043
- var stock = filteredSku.reduce(function (total, sku) {
19047
+ var stock = availableSku.reduce(function (total, sku) {
19044
19048
  total += sku.stock_num;
19045
19049
  return total;
19046
19050
  }, 0);
19047
19051
  return stock > 0;
19052
+ }; // 根据disable_status字段过滤skuTree
19053
+
19054
+ var sku_helper_filterDisabledSkuTree = function filterDisabledSkuTree(skuTree, skuList, selectedSku) {
19055
+ if (selectedSku === void 0) {
19056
+ selectedSku = {};
19057
+ }
19058
+
19059
+ if (!(skuList == null ? void 0 : skuList.length)) {
19060
+ return skuTree;
19061
+ } // 创建规格树的深拷贝,避免修改原始数据
19062
+
19063
+
19064
+ var treeClone = JSON.parse(JSON.stringify(skuTree)); // 对每个规格值,收集所有包含它的SKU
19065
+
19066
+ var specValueToSkus = {}; // 初始化规格值到SKU的映射
19067
+
19068
+ treeClone.forEach(function (treeItem) {
19069
+ var key = treeItem.k_s;
19070
+ treeItem.v.forEach(function (value) {
19071
+ var valueId = value.id;
19072
+ specValueToSkus[key + "-" + valueId] = [];
19073
+ });
19074
+ }); // 收集每个规格值对应的所有SKU
19075
+
19076
+ skuList.forEach(function (item) {
19077
+ for (var i = 1; i <= 5; i++) {
19078
+ var key = "s" + i;
19079
+ var value = item[key];
19080
+
19081
+ if (value && value !== '0') {
19082
+ var mapKey = key + "-" + value;
19083
+
19084
+ if (specValueToSkus[mapKey]) {
19085
+ specValueToSkus[mapKey].push(item);
19086
+ }
19087
+ }
19088
+ }
19089
+ }); // 过滤规格树
19090
+
19091
+ return treeClone.filter(function (treeItem) {
19092
+ var key = treeItem.k_s;
19093
+ var isSelectedSpec = selectedSku[key] && selectedSku[key] !== UNSELECTED_SKU_VALUE_ID; // 过滤规格值
19094
+
19095
+ treeItem.v = treeItem.v.filter(function (value) {
19096
+ var valueId = value.id;
19097
+ var mapKey = key + "-" + valueId;
19098
+ var relatedSkus = specValueToSkus[mapKey] || []; // 1. 如果所有包含该规格值的SKU都被明确禁用,则过滤掉该规格值
19099
+
19100
+ if (relatedSkus.length > 0) {
19101
+ var allExplicitlyDisabled = relatedSkus.every(function (sku) {
19102
+ return sku.disable_status === 1;
19103
+ });
19104
+
19105
+ if (allExplicitlyDisabled) {
19106
+ return false;
19107
+ }
19108
+ } // 2. 如果是已选中的值,保留它
19109
+
19110
+
19111
+ if (isSelectedSpec && String(valueId) === String(selectedSku[key])) {
19112
+ return true;
19113
+ } // 3. 如果用户已经选择了其他规格,检查组合
19114
+
19115
+
19116
+ var validSelectedEntries = Object.entries(selectedSku).filter(function (_ref) {
19117
+ var selectedKey = _ref[0],
19118
+ val = _ref[1];
19119
+ return val !== UNSELECTED_SKU_VALUE_ID && selectedKey !== key;
19120
+ } // 排除当前规格
19121
+ );
19122
+
19123
+ if (validSelectedEntries.length > 0) {
19124
+ // 创建当前组合
19125
+ var combinedSelection = {}; // 添加已选规格
19126
+
19127
+ validSelectedEntries.forEach(function (_ref2) {
19128
+ var selectedKey = _ref2[0],
19129
+ val = _ref2[1];
19130
+ combinedSelection[selectedKey] = val;
19131
+ }); // 添加当前正在检查的规格值
19132
+
19133
+ combinedSelection[key] = String(valueId); // 查找满足当前组合的SKU
19134
+
19135
+ var matchingSku = skuList.filter(function (sku) {
19136
+ return Object.entries(combinedSelection).every(function (_ref3) {
19137
+ var selectedKey = _ref3[0],
19138
+ selectedVal = _ref3[1];
19139
+ return String(sku[selectedKey]) === String(selectedVal);
19140
+ });
19141
+ }); // 如果有匹配的SKU,检查它们是否全部被禁用
19142
+
19143
+ if (matchingSku.length > 0) {
19144
+ var allDisabled = matchingSku.every(function (sku) {
19145
+ return sku.disable_status === 1;
19146
+ });
19147
+ return !allDisabled;
19148
+ }
19149
+ } // 默认保留所有规格值
19150
+
19151
+
19152
+ return true;
19153
+ }); // 如果是已选中的规格项,但过滤后没有包含已选值,则隐藏
19154
+
19155
+ if (isSelectedSpec) {
19156
+ var selectedValueExists = treeItem.v.some(function (value) {
19157
+ return String(value.id) === String(selectedSku[key]);
19158
+ });
19159
+ return selectedValueExists;
19160
+ } // 如果该规格项下没有规格值了,则隐藏整个规格项
19161
+
19162
+
19163
+ return treeItem.v.length > 0;
19164
+ });
19048
19165
  };
19049
19166
  var sku_helper_getSelectedPropValues = function getSelectedPropValues(propList, selectedProp) {
19050
19167
  var normalizeProp = normalizePropList(propList);
@@ -19079,7 +19196,8 @@ var sku_helper_getSelectedProperties = function getSelectedProperties(propList,
19079
19196
  isAllSelected: sku_helper_isAllSelected,
19080
19197
  isSkuChoosable: sku_helper_isSkuChoosable,
19081
19198
  getSelectedPropValues: sku_helper_getSelectedPropValues,
19082
- getSelectedProperties: sku_helper_getSelectedProperties
19199
+ getSelectedProperties: sku_helper_getSelectedProperties,
19200
+ filterDisabledSkuTree: sku_helper_filterDisabledSkuTree
19083
19201
  });
19084
19202
  // CONCATENATED MODULE: ./es/sku/components/SkuHeader.js
19085
19203
 
@@ -21204,7 +21322,6 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21204
21322
  value: function value(val) {
21205
21323
  this.show = val;
21206
21324
  },
21207
- skuTree: 'resetSelectedSku',
21208
21325
  initialSku: function initialSku() {
21209
21326
  this.resetStepper();
21210
21327
  this.resetSelectedSku();
@@ -21302,7 +21419,13 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21302
21419
  return this.sku.origin_price;
21303
21420
  },
21304
21421
  skuTree: function skuTree() {
21305
- return this.sku.tree || [];
21422
+ var originTree = this.sku.tree || []; // 避免不必要的重复计算
21423
+
21424
+ if (!originTree.length || !this.skuList.length) {
21425
+ return originTree;
21426
+ }
21427
+
21428
+ return sku_helper_filterDisabledSkuTree(originTree, this.skuList, this.selectedSku);
21306
21429
  },
21307
21430
  skuList: function skuList() {
21308
21431
  return this.sku.list || [];
@@ -21424,7 +21547,16 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21424
21547
  resetSelectedSku: function resetSelectedSku() {
21425
21548
  var _this3 = this;
21426
21549
 
21427
- this.selectedSku = {}; // 重置 selectedSku
21550
+ this.selectedSku = {}; // 检查initialSku中指定的值是否全部被禁用
21551
+
21552
+ var initialSkuDisabled = this.checkInitialSkuDisabled(); // 如果initialSku中的值全部被禁用,直接返回空选择
21553
+
21554
+ if (initialSkuDisabled) {
21555
+ // 重置商品属性
21556
+ this.resetSelectedProp();
21557
+ return;
21558
+ } // 重置 selectedSku
21559
+
21428
21560
 
21429
21561
  this.skuTree.forEach(function (item) {
21430
21562
  _this3.selectedSku[item.k_s] = UNSELECTED_SKU_VALUE_ID;
@@ -21438,7 +21570,18 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21438
21570
  key: key,
21439
21571
  valueId: valueId
21440
21572
  })) {
21441
- _this3.selectedSku[key] = valueId;
21573
+ // 检查是否有对应的非禁用SKU
21574
+ var skusWithThisValue = _this3.skuList.filter(function (sku) {
21575
+ return String(sku[key]) === String(valueId);
21576
+ });
21577
+
21578
+ var hasNonDisabledSku = skusWithThisValue.some(function (sku) {
21579
+ return sku.disable_status !== 1;
21580
+ });
21581
+
21582
+ if (hasNonDisabledSku) {
21583
+ _this3.selectedSku[key] = valueId;
21584
+ }
21442
21585
  }
21443
21586
  });
21444
21587
  var skuValues = this.selectedSkuValues;
@@ -21451,8 +21594,51 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21451
21594
  selectedSkuComb: _this3.selectedSkuComb
21452
21595
  });
21453
21596
  });
21454
- } // 重置商品属性
21597
+ }
21598
+
21599
+ this.resetSelectedProp(); // 抛出重置事件
21600
+
21601
+ this.$emit('sku-reset', {
21602
+ selectedSku: this.selectedSku,
21603
+ selectedProp: this.selectedProp,
21604
+ selectedSkuComb: this.selectedSkuComb
21605
+ });
21606
+ this.centerInitialSku();
21607
+ },
21608
+ // 检查initialSku中指定的值是否全部被禁用
21609
+ checkInitialSkuDisabled: function checkInitialSkuDisabled() {
21610
+ var _this4 = this; // 如果没有initialSku或者没有skuList,则不进行检查
21611
+
21612
+
21613
+ if (Object(utils["d" /* isEmpty */])(this.initialSku) || !this.skuList.length) {
21614
+ return false;
21615
+ } // 只关注 s1 到 s5 的规格键
21616
+
21617
+
21618
+ var skuKeys = ['s1', 's2', 's3', 's4', 's5']; // 获取initialSku中有效的规格项
21619
+
21620
+ var initialSkuKeys = skuKeys.filter(function (key) {
21621
+ return _this4.initialSku[key] !== undefined && _this4.initialSku[key] !== UNSELECTED_SKU_VALUE_ID && _this4.initialSku[key] !== '';
21622
+ }); // 如果没有有效的规格项,则不进行检查
21623
+
21624
+ if (!initialSkuKeys.length) {
21625
+ return false;
21626
+ } // 查找符合initialSku的所有sku组合
21627
+
21628
+
21629
+ var matchedSkus = this.skuList.filter(function (sku) {
21630
+ return initialSkuKeys.every(function (key) {
21631
+ return String(sku[key]) === String(_this4.initialSku[key]);
21632
+ });
21633
+ }); // 如果没有匹配的sku或者所有匹配的sku都被禁用,则返回true
21455
21634
 
21635
+ return !matchedSkus.length || matchedSkus.every(function (sku) {
21636
+ return sku.disable_status === 1;
21637
+ });
21638
+ },
21639
+ // 重置商品属性
21640
+ resetSelectedProp: function resetSelectedProp() {
21641
+ var _this5 = this;
21456
21642
 
21457
21643
  this.selectedProp = {};
21458
21644
  var _this$initialSku$sele = this.initialSku.selectedProp,
@@ -21460,7 +21646,7 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21460
21646
 
21461
21647
  this.propList.forEach(function (item) {
21462
21648
  if (selectedProp[item.k_id]) {
21463
- _this3.selectedProp[item.k_id] = selectedProp[item.k_id];
21649
+ _this5.selectedProp[item.k_id] = selectedProp[item.k_id];
21464
21650
  }
21465
21651
  });
21466
21652
 
@@ -21484,7 +21670,7 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21484
21670
  });
21485
21671
 
21486
21672
  if (firstEnableProp) {
21487
- _this3.selectedProp[k_id] = [firstEnableProp.id];
21673
+ _this5.selectedProp[k_id] = [firstEnableProp.id];
21488
21674
  }
21489
21675
  }
21490
21676
  }
@@ -21499,15 +21685,7 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21499
21685
  selectedProp: this.selectedProp,
21500
21686
  selectedSkuComb: this.selectedSkuComb
21501
21687
  });
21502
- } // 抛出重置事件
21503
-
21504
-
21505
- this.$emit('sku-reset', {
21506
- selectedSku: this.selectedSku,
21507
- selectedProp: this.selectedProp,
21508
- selectedSkuComb: this.selectedSkuComb
21509
- });
21510
- this.centerInitialSku();
21688
+ }
21511
21689
  },
21512
21690
  getSkuMessages: function getSkuMessages() {
21513
21691
  return this.$refs.skuMessages ? this.$refs.skuMessages.getMessages() : {};
@@ -21536,27 +21714,39 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21536
21714
  return Sku_t('selectSku');
21537
21715
  },
21538
21716
  onSelect: function onSelect(skuValue) {
21539
- var _extends2, _extends3; // 点击已选中的sku时则取消选中
21717
+ var _this6 = this; // 点击已选中的sku时则取消选中
21540
21718
 
21541
21719
 
21542
- this.selectedSku = this.selectedSku[skuValue.skuKeyStr] === skuValue.id ? _extends({}, this.selectedSku, (_extends2 = {}, _extends2[skuValue.skuKeyStr] = UNSELECTED_SKU_VALUE_ID, _extends2)) : _extends({}, this.selectedSku, (_extends3 = {}, _extends3[skuValue.skuKeyStr] = skuValue.id, _extends3)); // 切换sku清空当前选择属性数据,触发prop-clear
21720
+ var newSelectedSku = _extends({}, this.selectedSku);
21721
+
21722
+ if (newSelectedSku[skuValue.skuKeyStr] === skuValue.id) {
21723
+ newSelectedSku[skuValue.skuKeyStr] = UNSELECTED_SKU_VALUE_ID;
21724
+ } else {
21725
+ newSelectedSku[skuValue.skuKeyStr] = skuValue.id;
21726
+ } // 使用 Vue.set 来确保正确触发响应式更新
21727
+
21728
+
21729
+ this.selectedSku = newSelectedSku; // 切换sku清空当前选择属性数据,触发prop-clear
21543
21730
 
21544
21731
  if (this.isSkuProperties) {
21545
21732
  this.selectedProp = {};
21546
21733
  this.onPropClear();
21547
- }
21734
+ } // 使用 $nextTick 等待 DOM 更新后再触发事件
21548
21735
 
21549
- this.$emit('sku-selected', {
21550
- skuValue: skuValue,
21551
- selectedSku: this.selectedSku,
21552
- selectedSkuComb: this.selectedSkuComb
21736
+
21737
+ this.$nextTick(function () {
21738
+ _this6.$emit('sku-selected', {
21739
+ skuValue: skuValue,
21740
+ selectedSku: _this6.selectedSku,
21741
+ selectedSkuComb: _this6.selectedSkuComb
21742
+ });
21553
21743
  });
21554
21744
  },
21555
21745
  onPropClear: function onPropClear() {
21556
21746
  this.$emit('sku-prop-clear');
21557
21747
  },
21558
21748
  onPropSelect: function onPropSelect(propValue) {
21559
- var _extends4;
21749
+ var _extends2;
21560
21750
 
21561
21751
  var arr = this.selectedProp[propValue.skuKeyStr] || [];
21562
21752
  var pos = arr.indexOf(propValue.id);
@@ -21569,7 +21759,7 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21569
21759
  arr.splice(0, 1, propValue.id);
21570
21760
  }
21571
21761
 
21572
- this.selectedProp = _extends({}, this.selectedProp, (_extends4 = {}, _extends4[propValue.skuKeyStr] = arr, _extends4));
21762
+ this.selectedProp = _extends({}, this.selectedProp, (_extends2 = {}, _extends2[propValue.skuKeyStr] = arr, _extends2));
21573
21763
  this.$emit('sku-prop-selected', {
21574
21764
  propValue: propValue,
21575
21765
  selectedProp: this.selectedProp,
@@ -21580,7 +21770,7 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21580
21770
  this.selectedNum = num;
21581
21771
  },
21582
21772
  onPreviewImage: function onPreviewImage(selectedValue) {
21583
- var _this4 = this;
21773
+ var _this7 = this;
21584
21774
 
21585
21775
  var imageList = this.imageList;
21586
21776
  var index = 0;
@@ -21614,7 +21804,7 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21614
21804
  images: this.imageList,
21615
21805
  startPosition: index,
21616
21806
  onClose: function onClose() {
21617
- _this4.$emit('close-preview', params);
21807
+ _this7.$emit('close-preview', params);
21618
21808
  }
21619
21809
  });
21620
21810
  },
@@ -21688,18 +21878,18 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21688
21878
  this.centerInitialSku();
21689
21879
  },
21690
21880
  centerInitialSku: function centerInitialSku() {
21691
- var _this5 = this;
21881
+ var _this8 = this;
21692
21882
 
21693
21883
  (this.$refs.skuRows || []).forEach(function (it) {
21694
21884
  var _ref = it.skuRow || {},
21695
21885
  k_s = _ref.k_s;
21696
21886
 
21697
- it.centerItem(_this5.initialSku[k_s]);
21887
+ it.centerItem(_this8.initialSku[k_s]);
21698
21888
  });
21699
21889
  }
21700
21890
  },
21701
21891
  render: function render() {
21702
- var _this6 = this;
21892
+ var _this9 = this;
21703
21893
 
21704
21894
  var h = arguments[0];
21705
21895
 
@@ -21731,7 +21921,7 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21731
21921
  };
21732
21922
 
21733
21923
  var slots = function slots(name) {
21734
- return _this6.slots(name, slotsProps);
21924
+ return _this9.slots(name, slotsProps);
21735
21925
  };
21736
21926
 
21737
21927
  var Header = slots('sku-header') || h(components_SkuHeader, {
@@ -21813,7 +22003,7 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21813
22003
  },
21814
22004
  "on": {
21815
22005
  "change": function change(event) {
21816
- _this6.$emit('stepper-change', event);
22006
+ _this9.$emit('stepper-change', event);
21817
22007
  }
21818
22008
  }
21819
22009
  });
@@ -21847,9 +22037,9 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21847
22037
  "opened": this.onOpened
21848
22038
  },
21849
22039
  "model": {
21850
- value: _this6.show,
22040
+ value: _this9.show,
21851
22041
  callback: function callback($$v) {
21852
- _this6.show = $$v;
22042
+ _this9.show = $$v;
21853
22043
  }
21854
22044
  }
21855
22045
  }, [Header, h("div", {
@@ -23229,7 +23419,7 @@ TreeSelect.props = {
23229
23419
 
23230
23420
 
23231
23421
 
23232
- var version = '2.13.8';
23422
+ var version = '2.13.9';
23233
23423
 
23234
23424
  function install(Vue) {
23235
23425
  var components = [action_sheet, address_edit, address_list, es_area, badge, es_button, calendar, card, cascader, cell, cell_group, es_checkbox, checkbox_group, circle, col, collapse, collapse_item, contact_card, contact_edit, contact_list, count_down, es_coupon, coupon_cell, coupon_list, datetime_picker, dialog, divider, dropdown_item, dropdown_menu, empty, es_field, es_form, goods_action, goods_action_button, goods_action_icon, grid, grid_item, es_icon, es_image, image_preview, index_anchor, index_bar, es_info, es_list, es_loading, locale["a" /* default */], nav_bar, notice_bar, notify, number_keyboard, es_overlay, pagination, panel, password_input, es_picker, popover, popup, es_progress, pull_refresh, es_radio, radio_group, es_rate, row, search, share_sheet, sidebar, sidebar_item, skeleton, es_sku, slider, es_step, stepper, steps, es_sticky, submit_bar, swipe, swipe_cell, swipe_item, es_switch, switch_cell, tab, tabbar, tabbar_item, tabs, es_tag, es_toast, tree_select, uploader];