vant 2.13.7 → 2.13.9-beta.0

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();
@@ -21265,11 +21382,12 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21265
21382
  price: Math.round(this.sku.price * 100),
21266
21383
  stock_num: this.sku.stock_num
21267
21384
  };
21268
- }
21385
+ } // 更新当前规格属性数据
21386
+
21387
+
21388
+ this.setCurrentSkuProperties(skuComb ? skuComb.id : null);
21269
21389
 
21270
21390
  if (skuComb) {
21271
- // 更新当前规格属性数据
21272
- this.setCurrentSkuProperties(skuComb.id);
21273
21391
  skuComb.properties = sku_helper_getSelectedProperties(this.propList, this.selectedProp);
21274
21392
  skuComb.property_price = this.selectedPropValues.reduce(function (acc, cur) {
21275
21393
  return acc + (cur.price || 0);
@@ -21301,7 +21419,13 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21301
21419
  return this.sku.origin_price;
21302
21420
  },
21303
21421
  skuTree: function skuTree() {
21304
- 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);
21305
21429
  },
21306
21430
  skuList: function skuList() {
21307
21431
  return this.sku.list || [];
@@ -21423,7 +21547,16 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21423
21547
  resetSelectedSku: function resetSelectedSku() {
21424
21548
  var _this3 = this;
21425
21549
 
21426
- 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
+
21427
21560
 
21428
21561
  this.skuTree.forEach(function (item) {
21429
21562
  _this3.selectedSku[item.k_s] = UNSELECTED_SKU_VALUE_ID;
@@ -21437,7 +21570,18 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21437
21570
  key: key,
21438
21571
  valueId: valueId
21439
21572
  })) {
21440
- _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
+ }
21441
21585
  }
21442
21586
  });
21443
21587
  var skuValues = this.selectedSkuValues;
@@ -21450,8 +21594,51 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21450
21594
  selectedSkuComb: _this3.selectedSkuComb
21451
21595
  });
21452
21596
  });
21453
- } // 重置商品属性
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
21454
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;
21455
21642
 
21456
21643
  this.selectedProp = {};
21457
21644
  var _this$initialSku$sele = this.initialSku.selectedProp,
@@ -21459,7 +21646,7 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21459
21646
 
21460
21647
  this.propList.forEach(function (item) {
21461
21648
  if (selectedProp[item.k_id]) {
21462
- _this3.selectedProp[item.k_id] = selectedProp[item.k_id];
21649
+ _this5.selectedProp[item.k_id] = selectedProp[item.k_id];
21463
21650
  }
21464
21651
  });
21465
21652
 
@@ -21483,7 +21670,7 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21483
21670
  });
21484
21671
 
21485
21672
  if (firstEnableProp) {
21486
- _this3.selectedProp[k_id] = [firstEnableProp.id];
21673
+ _this5.selectedProp[k_id] = [firstEnableProp.id];
21487
21674
  }
21488
21675
  }
21489
21676
  }
@@ -21498,15 +21685,7 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21498
21685
  selectedProp: this.selectedProp,
21499
21686
  selectedSkuComb: this.selectedSkuComb
21500
21687
  });
21501
- } // 抛出重置事件
21502
-
21503
-
21504
- this.$emit('sku-reset', {
21505
- selectedSku: this.selectedSku,
21506
- selectedProp: this.selectedProp,
21507
- selectedSkuComb: this.selectedSkuComb
21508
- });
21509
- this.centerInitialSku();
21688
+ }
21510
21689
  },
21511
21690
  getSkuMessages: function getSkuMessages() {
21512
21691
  return this.$refs.skuMessages ? this.$refs.skuMessages.getMessages() : {};
@@ -21535,27 +21714,39 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21535
21714
  return Sku_t('selectSku');
21536
21715
  },
21537
21716
  onSelect: function onSelect(skuValue) {
21538
- var _extends2, _extends3; // 点击已选中的sku时则取消选中
21717
+ var _this6 = this; // 点击已选中的sku时则取消选中
21539
21718
 
21540
21719
 
21541
- 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
21542
21730
 
21543
21731
  if (this.isSkuProperties) {
21544
21732
  this.selectedProp = {};
21545
21733
  this.onPropClear();
21546
- }
21734
+ } // 使用 $nextTick 等待 DOM 更新后再触发事件
21547
21735
 
21548
- this.$emit('sku-selected', {
21549
- skuValue: skuValue,
21550
- selectedSku: this.selectedSku,
21551
- 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
+ });
21552
21743
  });
21553
21744
  },
21554
21745
  onPropClear: function onPropClear() {
21555
21746
  this.$emit('sku-prop-clear');
21556
21747
  },
21557
21748
  onPropSelect: function onPropSelect(propValue) {
21558
- var _extends4;
21749
+ var _extends2;
21559
21750
 
21560
21751
  var arr = this.selectedProp[propValue.skuKeyStr] || [];
21561
21752
  var pos = arr.indexOf(propValue.id);
@@ -21568,7 +21759,7 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21568
21759
  arr.splice(0, 1, propValue.id);
21569
21760
  }
21570
21761
 
21571
- this.selectedProp = _extends({}, this.selectedProp, (_extends4 = {}, _extends4[propValue.skuKeyStr] = arr, _extends4));
21762
+ this.selectedProp = _extends({}, this.selectedProp, (_extends2 = {}, _extends2[propValue.skuKeyStr] = arr, _extends2));
21572
21763
  this.$emit('sku-prop-selected', {
21573
21764
  propValue: propValue,
21574
21765
  selectedProp: this.selectedProp,
@@ -21579,7 +21770,7 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21579
21770
  this.selectedNum = num;
21580
21771
  },
21581
21772
  onPreviewImage: function onPreviewImage(selectedValue) {
21582
- var _this4 = this;
21773
+ var _this7 = this;
21583
21774
 
21584
21775
  var imageList = this.imageList;
21585
21776
  var index = 0;
@@ -21613,7 +21804,7 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21613
21804
  images: this.imageList,
21614
21805
  startPosition: index,
21615
21806
  onClose: function onClose() {
21616
- _this4.$emit('close-preview', params);
21807
+ _this7.$emit('close-preview', params);
21617
21808
  }
21618
21809
  });
21619
21810
  },
@@ -21687,18 +21878,18 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21687
21878
  this.centerInitialSku();
21688
21879
  },
21689
21880
  centerInitialSku: function centerInitialSku() {
21690
- var _this5 = this;
21881
+ var _this8 = this;
21691
21882
 
21692
21883
  (this.$refs.skuRows || []).forEach(function (it) {
21693
21884
  var _ref = it.skuRow || {},
21694
21885
  k_s = _ref.k_s;
21695
21886
 
21696
- it.centerItem(_this5.initialSku[k_s]);
21887
+ it.centerItem(_this8.initialSku[k_s]);
21697
21888
  });
21698
21889
  }
21699
21890
  },
21700
21891
  render: function render() {
21701
- var _this6 = this;
21892
+ var _this9 = this;
21702
21893
 
21703
21894
  var h = arguments[0];
21704
21895
 
@@ -21730,7 +21921,7 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21730
21921
  };
21731
21922
 
21732
21923
  var slots = function slots(name) {
21733
- return _this6.slots(name, slotsProps);
21924
+ return _this9.slots(name, slotsProps);
21734
21925
  };
21735
21926
 
21736
21927
  var Header = slots('sku-header') || h(components_SkuHeader, {
@@ -21812,7 +22003,7 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21812
22003
  },
21813
22004
  "on": {
21814
22005
  "change": function change(event) {
21815
- _this6.$emit('stepper-change', event);
22006
+ _this9.$emit('stepper-change', event);
21816
22007
  }
21817
22008
  }
21818
22009
  });
@@ -21846,9 +22037,9 @@ var Sku_QUOTA_LIMIT = LIMIT_TYPE.QUOTA_LIMIT;
21846
22037
  "opened": this.onOpened
21847
22038
  },
21848
22039
  "model": {
21849
- value: _this6.show,
22040
+ value: _this9.show,
21850
22041
  callback: function callback($$v) {
21851
- _this6.show = $$v;
22042
+ _this9.show = $$v;
21852
22043
  }
21853
22044
  }
21854
22045
  }, [Header, h("div", {
@@ -23228,7 +23419,7 @@ TreeSelect.props = {
23228
23419
 
23229
23420
 
23230
23421
 
23231
- var version = '2.13.7';
23422
+ var version = '2.13.9-beta.0';
23232
23423
 
23233
23424
  function install(Vue) {
23234
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];