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/es/index.js CHANGED
@@ -87,7 +87,7 @@ import Tag from './tag';
87
87
  import Toast from './toast';
88
88
  import TreeSelect from './tree-select';
89
89
  import Uploader from './uploader';
90
- var version = '2.13.7';
90
+ var version = '2.13.9-beta.0';
91
91
 
92
92
  function install(Vue) {
93
93
  var components = [ActionSheet, AddressEdit, AddressList, Area, Badge, Button, Calendar, Card, Cascader, Cell, CellGroup, Checkbox, CheckboxGroup, Circle, Col, Collapse, CollapseItem, ContactCard, ContactEdit, ContactList, CountDown, Coupon, CouponCell, CouponList, DatetimePicker, Dialog, Divider, DropdownItem, DropdownMenu, Empty, Field, Form, GoodsAction, GoodsActionButton, GoodsActionIcon, Grid, GridItem, Icon, Image, ImagePreview, IndexAnchor, IndexBar, Info, List, Loading, Locale, NavBar, NoticeBar, Notify, NumberKeyboard, Overlay, Pagination, Panel, PasswordInput, Picker, Popover, Popup, Progress, PullRefresh, Radio, RadioGroup, Rate, Row, Search, ShareSheet, Sidebar, SidebarItem, Skeleton, Sku, Slider, Step, Stepper, Steps, Sticky, SubmitBar, Swipe, SwipeCell, SwipeItem, Switch, SwitchCell, Tab, Tabbar, TabbarItem, Tabs, Tag, Toast, TreeSelect, Uploader];
package/es/sku/Sku.js CHANGED
@@ -12,7 +12,7 @@ import SkuStepper from './components/SkuStepper';
12
12
  import SkuMessages from './components/SkuMessages';
13
13
  import SkuActions from './components/SkuActions';
14
14
  import { createNamespace, isEmpty } from '../utils';
15
- import { isAllSelected, isSkuChoosable, getSkuComb, getSelectedSkuValues, getSelectedPropValues, getSelectedProperties } from './utils/sku-helper';
15
+ import { isAllSelected, isSkuChoosable, getSkuComb, getSelectedSkuValues, getSelectedPropValues, getSelectedProperties, filterDisabledSkuTree } from './utils/sku-helper';
16
16
  import { LIMIT_TYPE, UNSELECTED_SKU_VALUE_ID } from './constants';
17
17
  var namespace = createNamespace('sku');
18
18
  var createComponent = namespace[0],
@@ -146,7 +146,6 @@ export default createComponent({
146
146
  value: function value(val) {
147
147
  this.show = val;
148
148
  },
149
- skuTree: 'resetSelectedSku',
150
149
  initialSku: function initialSku() {
151
150
  this.resetStepper();
152
151
  this.resetSelectedSku();
@@ -207,11 +206,12 @@ export default createComponent({
207
206
  price: Math.round(this.sku.price * 100),
208
207
  stock_num: this.sku.stock_num
209
208
  };
210
- }
209
+ } // 更新当前规格属性数据
210
+
211
+
212
+ this.setCurrentSkuProperties(skuComb ? skuComb.id : null);
211
213
 
212
214
  if (skuComb) {
213
- // 更新当前规格属性数据
214
- this.setCurrentSkuProperties(skuComb.id);
215
215
  skuComb.properties = getSelectedProperties(this.propList, this.selectedProp);
216
216
  skuComb.property_price = this.selectedPropValues.reduce(function (acc, cur) {
217
217
  return acc + (cur.price || 0);
@@ -243,7 +243,13 @@ export default createComponent({
243
243
  return this.sku.origin_price;
244
244
  },
245
245
  skuTree: function skuTree() {
246
- return this.sku.tree || [];
246
+ var originTree = this.sku.tree || []; // 避免不必要的重复计算
247
+
248
+ if (!originTree.length || !this.skuList.length) {
249
+ return originTree;
250
+ }
251
+
252
+ return filterDisabledSkuTree(originTree, this.skuList, this.selectedSku);
247
253
  },
248
254
  skuList: function skuList() {
249
255
  return this.sku.list || [];
@@ -365,7 +371,16 @@ export default createComponent({
365
371
  resetSelectedSku: function resetSelectedSku() {
366
372
  var _this3 = this;
367
373
 
368
- this.selectedSku = {}; // 重置 selectedSku
374
+ this.selectedSku = {}; // 检查initialSku中指定的值是否全部被禁用
375
+
376
+ var initialSkuDisabled = this.checkInitialSkuDisabled(); // 如果initialSku中的值全部被禁用,直接返回空选择
377
+
378
+ if (initialSkuDisabled) {
379
+ // 重置商品属性
380
+ this.resetSelectedProp();
381
+ return;
382
+ } // 重置 selectedSku
383
+
369
384
 
370
385
  this.skuTree.forEach(function (item) {
371
386
  _this3.selectedSku[item.k_s] = UNSELECTED_SKU_VALUE_ID;
@@ -379,7 +394,18 @@ export default createComponent({
379
394
  key: key,
380
395
  valueId: valueId
381
396
  })) {
382
- _this3.selectedSku[key] = valueId;
397
+ // 检查是否有对应的非禁用SKU
398
+ var skusWithThisValue = _this3.skuList.filter(function (sku) {
399
+ return String(sku[key]) === String(valueId);
400
+ });
401
+
402
+ var hasNonDisabledSku = skusWithThisValue.some(function (sku) {
403
+ return sku.disable_status !== 1;
404
+ });
405
+
406
+ if (hasNonDisabledSku) {
407
+ _this3.selectedSku[key] = valueId;
408
+ }
383
409
  }
384
410
  });
385
411
  var skuValues = this.selectedSkuValues;
@@ -392,8 +418,51 @@ export default createComponent({
392
418
  selectedSkuComb: _this3.selectedSkuComb
393
419
  });
394
420
  });
395
- } // 重置商品属性
421
+ }
422
+
423
+ this.resetSelectedProp(); // 抛出重置事件
424
+
425
+ this.$emit('sku-reset', {
426
+ selectedSku: this.selectedSku,
427
+ selectedProp: this.selectedProp,
428
+ selectedSkuComb: this.selectedSkuComb
429
+ });
430
+ this.centerInitialSku();
431
+ },
432
+ // 检查initialSku中指定的值是否全部被禁用
433
+ checkInitialSkuDisabled: function checkInitialSkuDisabled() {
434
+ var _this4 = this;
435
+
436
+ // 如果没有initialSku或者没有skuList,则不进行检查
437
+ if (isEmpty(this.initialSku) || !this.skuList.length) {
438
+ return false;
439
+ } // 只关注 s1 到 s5 的规格键
440
+
441
+
442
+ var skuKeys = ['s1', 's2', 's3', 's4', 's5']; // 获取initialSku中有效的规格项
396
443
 
444
+ var initialSkuKeys = skuKeys.filter(function (key) {
445
+ return _this4.initialSku[key] !== undefined && _this4.initialSku[key] !== UNSELECTED_SKU_VALUE_ID && _this4.initialSku[key] !== '';
446
+ }); // 如果没有有效的规格项,则不进行检查
447
+
448
+ if (!initialSkuKeys.length) {
449
+ return false;
450
+ } // 查找符合initialSku的所有sku组合
451
+
452
+
453
+ var matchedSkus = this.skuList.filter(function (sku) {
454
+ return initialSkuKeys.every(function (key) {
455
+ return String(sku[key]) === String(_this4.initialSku[key]);
456
+ });
457
+ }); // 如果没有匹配的sku或者所有匹配的sku都被禁用,则返回true
458
+
459
+ return !matchedSkus.length || matchedSkus.every(function (sku) {
460
+ return sku.disable_status === 1;
461
+ });
462
+ },
463
+ // 重置商品属性
464
+ resetSelectedProp: function resetSelectedProp() {
465
+ var _this5 = this;
397
466
 
398
467
  this.selectedProp = {};
399
468
  var _this$initialSku$sele = this.initialSku.selectedProp,
@@ -401,7 +470,7 @@ export default createComponent({
401
470
 
402
471
  this.propList.forEach(function (item) {
403
472
  if (selectedProp[item.k_id]) {
404
- _this3.selectedProp[item.k_id] = selectedProp[item.k_id];
473
+ _this5.selectedProp[item.k_id] = selectedProp[item.k_id];
405
474
  }
406
475
  });
407
476
 
@@ -425,7 +494,7 @@ export default createComponent({
425
494
  });
426
495
 
427
496
  if (firstEnableProp) {
428
- _this3.selectedProp[k_id] = [firstEnableProp.id];
497
+ _this5.selectedProp[k_id] = [firstEnableProp.id];
429
498
  }
430
499
  }
431
500
  }
@@ -440,15 +509,7 @@ export default createComponent({
440
509
  selectedProp: this.selectedProp,
441
510
  selectedSkuComb: this.selectedSkuComb
442
511
  });
443
- } // 抛出重置事件
444
-
445
-
446
- this.$emit('sku-reset', {
447
- selectedSku: this.selectedSku,
448
- selectedProp: this.selectedProp,
449
- selectedSkuComb: this.selectedSkuComb
450
- });
451
- this.centerInitialSku();
512
+ }
452
513
  },
453
514
  getSkuMessages: function getSkuMessages() {
454
515
  return this.$refs.skuMessages ? this.$refs.skuMessages.getMessages() : {};
@@ -477,27 +538,39 @@ export default createComponent({
477
538
  return t('selectSku');
478
539
  },
479
540
  onSelect: function onSelect(skuValue) {
480
- var _extends2, _extends3;
541
+ var _this6 = this;
481
542
 
482
543
  // 点击已选中的sku时则取消选中
483
- 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
544
+ var newSelectedSku = _extends({}, this.selectedSku);
545
+
546
+ if (newSelectedSku[skuValue.skuKeyStr] === skuValue.id) {
547
+ newSelectedSku[skuValue.skuKeyStr] = UNSELECTED_SKU_VALUE_ID;
548
+ } else {
549
+ newSelectedSku[skuValue.skuKeyStr] = skuValue.id;
550
+ } // 使用 Vue.set 来确保正确触发响应式更新
551
+
552
+
553
+ this.selectedSku = newSelectedSku; // 切换sku清空当前选择属性数据,触发prop-clear
484
554
 
485
555
  if (this.isSkuProperties) {
486
556
  this.selectedProp = {};
487
557
  this.onPropClear();
488
- }
558
+ } // 使用 $nextTick 等待 DOM 更新后再触发事件
489
559
 
490
- this.$emit('sku-selected', {
491
- skuValue: skuValue,
492
- selectedSku: this.selectedSku,
493
- selectedSkuComb: this.selectedSkuComb
560
+
561
+ this.$nextTick(function () {
562
+ _this6.$emit('sku-selected', {
563
+ skuValue: skuValue,
564
+ selectedSku: _this6.selectedSku,
565
+ selectedSkuComb: _this6.selectedSkuComb
566
+ });
494
567
  });
495
568
  },
496
569
  onPropClear: function onPropClear() {
497
570
  this.$emit('sku-prop-clear');
498
571
  },
499
572
  onPropSelect: function onPropSelect(propValue) {
500
- var _extends4;
573
+ var _extends2;
501
574
 
502
575
  var arr = this.selectedProp[propValue.skuKeyStr] || [];
503
576
  var pos = arr.indexOf(propValue.id);
@@ -510,7 +583,7 @@ export default createComponent({
510
583
  arr.splice(0, 1, propValue.id);
511
584
  }
512
585
 
513
- this.selectedProp = _extends({}, this.selectedProp, (_extends4 = {}, _extends4[propValue.skuKeyStr] = arr, _extends4));
586
+ this.selectedProp = _extends({}, this.selectedProp, (_extends2 = {}, _extends2[propValue.skuKeyStr] = arr, _extends2));
514
587
  this.$emit('sku-prop-selected', {
515
588
  propValue: propValue,
516
589
  selectedProp: this.selectedProp,
@@ -521,7 +594,7 @@ export default createComponent({
521
594
  this.selectedNum = num;
522
595
  },
523
596
  onPreviewImage: function onPreviewImage(selectedValue) {
524
- var _this4 = this;
597
+ var _this7 = this;
525
598
 
526
599
  var imageList = this.imageList;
527
600
  var index = 0;
@@ -555,7 +628,7 @@ export default createComponent({
555
628
  images: this.imageList,
556
629
  startPosition: index,
557
630
  onClose: function onClose() {
558
- _this4.$emit('close-preview', params);
631
+ _this7.$emit('close-preview', params);
559
632
  }
560
633
  });
561
634
  },
@@ -629,18 +702,18 @@ export default createComponent({
629
702
  this.centerInitialSku();
630
703
  },
631
704
  centerInitialSku: function centerInitialSku() {
632
- var _this5 = this;
705
+ var _this8 = this;
633
706
 
634
707
  (this.$refs.skuRows || []).forEach(function (it) {
635
708
  var _ref = it.skuRow || {},
636
709
  k_s = _ref.k_s;
637
710
 
638
- it.centerItem(_this5.initialSku[k_s]);
711
+ it.centerItem(_this8.initialSku[k_s]);
639
712
  });
640
713
  }
641
714
  },
642
715
  render: function render() {
643
- var _this6 = this;
716
+ var _this9 = this;
644
717
 
645
718
  var h = arguments[0];
646
719
 
@@ -672,7 +745,7 @@ export default createComponent({
672
745
  };
673
746
 
674
747
  var slots = function slots(name) {
675
- return _this6.slots(name, slotsProps);
748
+ return _this9.slots(name, slotsProps);
676
749
  };
677
750
 
678
751
  var Header = slots('sku-header') || h(SkuHeader, {
@@ -754,7 +827,7 @@ export default createComponent({
754
827
  },
755
828
  "on": {
756
829
  "change": function change(event) {
757
- _this6.$emit('stepper-change', event);
830
+ _this9.$emit('stepper-change', event);
758
831
  }
759
832
  }
760
833
  });
@@ -788,9 +861,9 @@ export default createComponent({
788
861
  "opened": this.onOpened
789
862
  },
790
863
  "model": {
791
- value: _this6.show,
864
+ value: _this9.show,
792
865
  callback: function callback($$v) {
793
- _this6.show = $$v;
866
+ _this9.show = $$v;
794
867
  }
795
868
  }
796
869
  }, [Header, h("div", {
@@ -104,12 +104,129 @@ export var isSkuChoosable = function isSkuChoosable(skuList, selectedSku, skuToC
104
104
  return skusToCheck.every(function (skuKey) {
105
105
  return String(matchedSku[skuKey]) === String(sku[skuKey]);
106
106
  });
107
+ }); // 检查是否有非禁用的SKU可选
108
+
109
+ var availableSku = filteredSku.filter(function (sku) {
110
+ return sku.disable_status !== 1;
107
111
  });
108
- var stock = filteredSku.reduce(function (total, sku) {
112
+ var stock = availableSku.reduce(function (total, sku) {
109
113
  total += sku.stock_num;
110
114
  return total;
111
115
  }, 0);
112
116
  return stock > 0;
117
+ }; // 根据disable_status字段过滤skuTree
118
+
119
+ export var filterDisabledSkuTree = function filterDisabledSkuTree(skuTree, skuList, selectedSku) {
120
+ if (selectedSku === void 0) {
121
+ selectedSku = {};
122
+ }
123
+
124
+ if (!(skuList == null ? void 0 : skuList.length)) {
125
+ return skuTree;
126
+ } // 创建规格树的深拷贝,避免修改原始数据
127
+
128
+
129
+ var treeClone = JSON.parse(JSON.stringify(skuTree)); // 对每个规格值,收集所有包含它的SKU
130
+
131
+ var specValueToSkus = {}; // 初始化规格值到SKU的映射
132
+
133
+ treeClone.forEach(function (treeItem) {
134
+ var key = treeItem.k_s;
135
+ treeItem.v.forEach(function (value) {
136
+ var valueId = value.id;
137
+ specValueToSkus[key + "-" + valueId] = [];
138
+ });
139
+ }); // 收集每个规格值对应的所有SKU
140
+
141
+ skuList.forEach(function (item) {
142
+ for (var i = 1; i <= 5; i++) {
143
+ var key = "s" + i;
144
+ var value = item[key];
145
+
146
+ if (value && value !== '0') {
147
+ var mapKey = key + "-" + value;
148
+
149
+ if (specValueToSkus[mapKey]) {
150
+ specValueToSkus[mapKey].push(item);
151
+ }
152
+ }
153
+ }
154
+ }); // 过滤规格树
155
+
156
+ return treeClone.filter(function (treeItem) {
157
+ var key = treeItem.k_s;
158
+ var isSelectedSpec = selectedSku[key] && selectedSku[key] !== UNSELECTED_SKU_VALUE_ID; // 过滤规格值
159
+
160
+ treeItem.v = treeItem.v.filter(function (value) {
161
+ var valueId = value.id;
162
+ var mapKey = key + "-" + valueId;
163
+ var relatedSkus = specValueToSkus[mapKey] || []; // 1. 如果所有包含该规格值的SKU都被明确禁用,则过滤掉该规格值
164
+
165
+ if (relatedSkus.length > 0) {
166
+ var allExplicitlyDisabled = relatedSkus.every(function (sku) {
167
+ return sku.disable_status === 1;
168
+ });
169
+
170
+ if (allExplicitlyDisabled) {
171
+ return false;
172
+ }
173
+ } // 2. 如果是已选中的值,保留它
174
+
175
+
176
+ if (isSelectedSpec && String(valueId) === String(selectedSku[key])) {
177
+ return true;
178
+ } // 3. 如果用户已经选择了其他规格,检查组合
179
+
180
+
181
+ var validSelectedEntries = Object.entries(selectedSku).filter(function (_ref) {
182
+ var selectedKey = _ref[0],
183
+ val = _ref[1];
184
+ return val !== UNSELECTED_SKU_VALUE_ID && selectedKey !== key;
185
+ } // 排除当前规格
186
+ );
187
+
188
+ if (validSelectedEntries.length > 0) {
189
+ // 创建当前组合
190
+ var combinedSelection = {}; // 添加已选规格
191
+
192
+ validSelectedEntries.forEach(function (_ref2) {
193
+ var selectedKey = _ref2[0],
194
+ val = _ref2[1];
195
+ combinedSelection[selectedKey] = val;
196
+ }); // 添加当前正在检查的规格值
197
+
198
+ combinedSelection[key] = String(valueId); // 查找满足当前组合的SKU
199
+
200
+ var matchingSku = skuList.filter(function (sku) {
201
+ return Object.entries(combinedSelection).every(function (_ref3) {
202
+ var selectedKey = _ref3[0],
203
+ selectedVal = _ref3[1];
204
+ return String(sku[selectedKey]) === String(selectedVal);
205
+ });
206
+ }); // 如果有匹配的SKU,检查它们是否全部被禁用
207
+
208
+ if (matchingSku.length > 0) {
209
+ var allDisabled = matchingSku.every(function (sku) {
210
+ return sku.disable_status === 1;
211
+ });
212
+ return !allDisabled;
213
+ }
214
+ } // 默认保留所有规格值
215
+
216
+
217
+ return true;
218
+ }); // 如果是已选中的规格项,但过滤后没有包含已选值,则隐藏
219
+
220
+ if (isSelectedSpec) {
221
+ var selectedValueExists = treeItem.v.some(function (value) {
222
+ return String(value.id) === String(selectedSku[key]);
223
+ });
224
+ return selectedValueExists;
225
+ } // 如果该规格项下没有规格值了,则隐藏整个规格项
226
+
227
+
228
+ return treeItem.v.length > 0;
229
+ });
113
230
  };
114
231
  export var getSelectedPropValues = function getSelectedPropValues(propList, selectedProp) {
115
232
  var normalizeProp = normalizePropList(propList);
@@ -144,5 +261,6 @@ export default {
144
261
  isAllSelected: isAllSelected,
145
262
  isSkuChoosable: isSkuChoosable,
146
263
  getSelectedPropValues: getSelectedPropValues,
147
- getSelectedProperties: getSelectedProperties
264
+ getSelectedProperties: getSelectedProperties,
265
+ filterDisabledSkuTree: filterDisabledSkuTree
148
266
  };
package/lib/index.js CHANGED
@@ -361,7 +361,7 @@ exports.TreeSelect = _treeSelect.default;
361
361
  var _uploader = _interopRequireDefault(require("./uploader"));
362
362
 
363
363
  exports.Uploader = _uploader.default;
364
- var version = '2.13.7';
364
+ var version = '2.13.9-beta.0';
365
365
  exports.version = version;
366
366
 
367
367
  function install(Vue) {