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 +1 -1
- package/es/sku/Sku.js +111 -38
- package/es/sku/utils/sku-helper.js +120 -2
- package/lib/index.js +1 -1
- package/lib/sku/Sku.js +113 -40
- package/lib/sku/utils/sku-helper.js +125 -4
- package/lib/vant.js +231 -40
- package/lib/vant.min.js +1 -1
- package/package.json +1 -1
- package/vetur/attributes.json +184 -180
- package/vetur/tags.json +69 -68
- package/vetur/web-types.json +479 -470
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
|
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();
|
@@ -231,11 +230,12 @@ var _default2 = createComponent({
|
|
231
230
|
price: Math.round(this.sku.price * 100),
|
232
231
|
stock_num: this.sku.stock_num
|
233
232
|
};
|
234
|
-
}
|
233
|
+
} // 更新当前规格属性数据
|
234
|
+
|
235
|
+
|
236
|
+
this.setCurrentSkuProperties(skuComb ? skuComb.id : null);
|
235
237
|
|
236
238
|
if (skuComb) {
|
237
|
-
// 更新当前规格属性数据
|
238
|
-
this.setCurrentSkuProperties(skuComb.id);
|
239
239
|
skuComb.properties = (0, _skuHelper.getSelectedProperties)(this.propList, this.selectedProp);
|
240
240
|
skuComb.property_price = this.selectedPropValues.reduce(function (acc, cur) {
|
241
241
|
return acc + (cur.price || 0);
|
@@ -267,7 +267,13 @@ var _default2 = createComponent({
|
|
267
267
|
return this.sku.origin_price;
|
268
268
|
},
|
269
269
|
skuTree: function skuTree() {
|
270
|
-
|
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);
|
271
277
|
},
|
272
278
|
skuList: function skuList() {
|
273
279
|
return this.sku.list || [];
|
@@ -389,7 +395,16 @@ var _default2 = createComponent({
|
|
389
395
|
resetSelectedSku: function resetSelectedSku() {
|
390
396
|
var _this3 = this;
|
391
397
|
|
392
|
-
this.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
|
+
|
393
408
|
|
394
409
|
this.skuTree.forEach(function (item) {
|
395
410
|
_this3.selectedSku[item.k_s] = _constants.UNSELECTED_SKU_VALUE_ID;
|
@@ -403,7 +418,18 @@ var _default2 = createComponent({
|
|
403
418
|
key: key,
|
404
419
|
valueId: valueId
|
405
420
|
})) {
|
406
|
-
|
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
|
+
}
|
407
433
|
}
|
408
434
|
});
|
409
435
|
var skuValues = this.selectedSkuValues;
|
@@ -416,8 +442,51 @@ var _default2 = createComponent({
|
|
416
442
|
selectedSkuComb: _this3.selectedSkuComb
|
417
443
|
});
|
418
444
|
});
|
419
|
-
}
|
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中有效的规格项
|
420
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
|
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;
|
421
490
|
|
422
491
|
this.selectedProp = {};
|
423
492
|
var _this$initialSku$sele = this.initialSku.selectedProp,
|
@@ -425,7 +494,7 @@ var _default2 = createComponent({
|
|
425
494
|
|
426
495
|
this.propList.forEach(function (item) {
|
427
496
|
if (selectedProp[item.k_id]) {
|
428
|
-
|
497
|
+
_this5.selectedProp[item.k_id] = selectedProp[item.k_id];
|
429
498
|
}
|
430
499
|
});
|
431
500
|
|
@@ -449,7 +518,7 @@ var _default2 = createComponent({
|
|
449
518
|
});
|
450
519
|
|
451
520
|
if (firstEnableProp) {
|
452
|
-
|
521
|
+
_this5.selectedProp[k_id] = [firstEnableProp.id];
|
453
522
|
}
|
454
523
|
}
|
455
524
|
}
|
@@ -464,15 +533,7 @@ var _default2 = createComponent({
|
|
464
533
|
selectedProp: this.selectedProp,
|
465
534
|
selectedSkuComb: this.selectedSkuComb
|
466
535
|
});
|
467
|
-
}
|
468
|
-
|
469
|
-
|
470
|
-
this.$emit('sku-reset', {
|
471
|
-
selectedSku: this.selectedSku,
|
472
|
-
selectedProp: this.selectedProp,
|
473
|
-
selectedSkuComb: this.selectedSkuComb
|
474
|
-
});
|
475
|
-
this.centerInitialSku();
|
536
|
+
}
|
476
537
|
},
|
477
538
|
getSkuMessages: function getSkuMessages() {
|
478
539
|
return this.$refs.skuMessages ? this.$refs.skuMessages.getMessages() : {};
|
@@ -501,27 +562,39 @@ var _default2 = createComponent({
|
|
501
562
|
return t('selectSku');
|
502
563
|
},
|
503
564
|
onSelect: function onSelect(skuValue) {
|
504
|
-
var
|
565
|
+
var _this6 = this;
|
505
566
|
|
506
567
|
// 点击已选中的sku时则取消选中
|
507
|
-
|
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
|
508
578
|
|
509
579
|
if (this.isSkuProperties) {
|
510
580
|
this.selectedProp = {};
|
511
581
|
this.onPropClear();
|
512
|
-
}
|
582
|
+
} // 使用 $nextTick 等待 DOM 更新后再触发事件
|
513
583
|
|
514
|
-
|
515
|
-
|
516
|
-
|
517
|
-
|
584
|
+
|
585
|
+
this.$nextTick(function () {
|
586
|
+
_this6.$emit('sku-selected', {
|
587
|
+
skuValue: skuValue,
|
588
|
+
selectedSku: _this6.selectedSku,
|
589
|
+
selectedSkuComb: _this6.selectedSkuComb
|
590
|
+
});
|
518
591
|
});
|
519
592
|
},
|
520
593
|
onPropClear: function onPropClear() {
|
521
594
|
this.$emit('sku-prop-clear');
|
522
595
|
},
|
523
596
|
onPropSelect: function onPropSelect(propValue) {
|
524
|
-
var
|
597
|
+
var _extends2;
|
525
598
|
|
526
599
|
var arr = this.selectedProp[propValue.skuKeyStr] || [];
|
527
600
|
var pos = arr.indexOf(propValue.id);
|
@@ -534,7 +607,7 @@ var _default2 = createComponent({
|
|
534
607
|
arr.splice(0, 1, propValue.id);
|
535
608
|
}
|
536
609
|
|
537
|
-
this.selectedProp = (0,
|
610
|
+
this.selectedProp = (0, _extends3.default)({}, this.selectedProp, (_extends2 = {}, _extends2[propValue.skuKeyStr] = arr, _extends2));
|
538
611
|
this.$emit('sku-prop-selected', {
|
539
612
|
propValue: propValue,
|
540
613
|
selectedProp: this.selectedProp,
|
@@ -545,7 +618,7 @@ var _default2 = createComponent({
|
|
545
618
|
this.selectedNum = num;
|
546
619
|
},
|
547
620
|
onPreviewImage: function onPreviewImage(selectedValue) {
|
548
|
-
var
|
621
|
+
var _this7 = this;
|
549
622
|
|
550
623
|
var imageList = this.imageList;
|
551
624
|
var index = 0;
|
@@ -563,7 +636,7 @@ var _default2 = createComponent({
|
|
563
636
|
indexImage = selectedValue.imgUrl;
|
564
637
|
}
|
565
638
|
|
566
|
-
var params = (0,
|
639
|
+
var params = (0, _extends3.default)({}, selectedValue, {
|
567
640
|
index: index,
|
568
641
|
imageList: this.imageList,
|
569
642
|
indexImage: indexImage
|
@@ -578,7 +651,7 @@ var _default2 = createComponent({
|
|
578
651
|
images: this.imageList,
|
579
652
|
startPosition: index,
|
580
653
|
onClose: function onClose() {
|
581
|
-
|
654
|
+
_this7.$emit('close-preview', params);
|
582
655
|
}
|
583
656
|
});
|
584
657
|
},
|
@@ -613,7 +686,7 @@ var _default2 = createComponent({
|
|
613
686
|
}
|
614
687
|
},
|
615
688
|
onStepperState: function onStepperState(data) {
|
616
|
-
this.stepperError = data.valid ? null : (0,
|
689
|
+
this.stepperError = data.valid ? null : (0, _extends3.default)({}, data, {
|
617
690
|
action: 'plus'
|
618
691
|
});
|
619
692
|
},
|
@@ -652,18 +725,18 @@ var _default2 = createComponent({
|
|
652
725
|
this.centerInitialSku();
|
653
726
|
},
|
654
727
|
centerInitialSku: function centerInitialSku() {
|
655
|
-
var
|
728
|
+
var _this8 = this;
|
656
729
|
|
657
730
|
(this.$refs.skuRows || []).forEach(function (it) {
|
658
731
|
var _ref = it.skuRow || {},
|
659
732
|
k_s = _ref.k_s;
|
660
733
|
|
661
|
-
it.centerItem(
|
734
|
+
it.centerItem(_this8.initialSku[k_s]);
|
662
735
|
});
|
663
736
|
}
|
664
737
|
},
|
665
738
|
render: function render() {
|
666
|
-
var
|
739
|
+
var _this9 = this;
|
667
740
|
|
668
741
|
var h = arguments[0];
|
669
742
|
|
@@ -695,7 +768,7 @@ var _default2 = createComponent({
|
|
695
768
|
};
|
696
769
|
|
697
770
|
var slots = function slots(name) {
|
698
|
-
return
|
771
|
+
return _this9.slots(name, slotsProps);
|
699
772
|
};
|
700
773
|
|
701
774
|
var Header = slots('sku-header') || h(_SkuHeader.default, {
|
@@ -777,7 +850,7 @@ var _default2 = createComponent({
|
|
777
850
|
},
|
778
851
|
"on": {
|
779
852
|
"change": function change(event) {
|
780
|
-
|
853
|
+
_this9.$emit('stepper-change', event);
|
781
854
|
}
|
782
855
|
}
|
783
856
|
});
|
@@ -811,9 +884,9 @@ var _default2 = createComponent({
|
|
811
884
|
"opened": this.onOpened
|
812
885
|
},
|
813
886
|
"model": {
|
814
|
-
value:
|
887
|
+
value: _this9.show,
|
815
888
|
callback: function callback($$v) {
|
816
|
-
|
889
|
+
_this9.show = $$v;
|
817
890
|
}
|
818
891
|
}
|
819
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 =
|
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;
|