Commit 3a3be61a254f53c2589b93c34fdddb62d418054b

Authored by Aresn
Committed by GitHub
2 parents 273cc057 1d680640

Merge pull request #3798 from m430/bug-3795

Select patches: fix bug #3795 #3722 修复select异步获取option数据导致,v-model失效等问题
src/components/select/select-head.vue
... ... @@ -58,7 +58,7 @@
58 58 default: false
59 59 },
60 60 initialLabel: {
61   - type: String,
  61 + type: [String, Number, Array],
62 62 },
63 63 values: {
64 64 type: Array,
... ...
src/components/select/select.vue
... ... @@ -230,9 +230,7 @@
230 230 }).filter(Boolean);
231 231 }
232 232  
233   - if (this.values.length > 0 && this.selectOptions.length === 0){
234   - this.hasExpectedValue = this.values;
235   - }
  233 + this.checkUpdateStatus();
236 234 },
237 235 data () {
238 236  
... ... @@ -353,7 +351,7 @@
353 351 });
354 352 });
355 353 }
356   -
  354 + let hasDefaultSelected = slotOptions.some(option => this.query === option.key);
357 355 for (let option of slotOptions) {
358 356  
359 357 const cOptions = option.componentOptions;
... ... @@ -377,8 +375,10 @@
377 375 if (cOptions.children.length > 0) selectOptions.push({...option});
378 376 } else {
379 377 // ignore option if not passing filter
380   - const optionPassesFilter = this.filterable ? this.validateOption(cOptions) : option;
381   - if (!optionPassesFilter) continue;
  378 + if (!hasDefaultSelected) {
  379 + const optionPassesFilter = this.filterable ? this.validateOption(cOptions) : option;
  380 + if (!optionPassesFilter) continue;
  381 + }
382 382  
383 383 optionCounter = optionCounter + 1;
384 384 selectOptions.push(this.processOption(option, selectedValues, optionCounter === currentIndex));
... ... @@ -426,6 +426,7 @@
426 426 const {multiple, value} = this;
427 427 let initialValue = Array.isArray(value) ? value : [value];
428 428 if (!multiple && (typeof initialValue[0] === 'undefined' || (String(initialValue[0]).trim() === '' && !Number.isFinite(initialValue[0])))) initialValue = [];
  429 + if (this.remote && !this.multiple && this.value) this.query = value;
429 430 return initialValue.filter((item) => {
430 431 return Boolean(item) || item === 0;
431 432 });
... ... @@ -632,12 +633,19 @@
632 633 },
633 634 updateSlotOptions(){
634 635 this.slotOptions = this.$slots.default;
  636 + },
  637 + checkUpdateStatus() {
  638 + if (this.getInitialValue().length > 0 && this.selectOptions.length === 0) {
  639 + this.hasExpectedValue = true;
  640 + }
635 641 }
636 642 },
637 643 watch: {
638 644 value(value){
639 645 const {getInitialValue, getOptionData, publicValue} = this;
640 646  
  647 + this.checkUpdateStatus();
  648 +
641 649 if (value === '') this.values = [];
642 650 else if (JSON.stringify(value) !== JSON.stringify(publicValue)) {
643 651 this.$nextTick(() => this.values = getInitialValue().map(getOptionData).filter(Boolean));
... ... @@ -716,7 +724,10 @@
716 724 this.broadcast('Drop', open ? 'on-update-popper' : 'on-destroy-popper');
717 725 },
718 726 selectOptions(){
719   - if (this.hasExpectedValue){
  727 + if (this.hasExpectedValue && this.selectOptions.length > 0){
  728 + if (this.values.length === 0) {
  729 + this.values = this.getInitialValue();
  730 + }
720 731 this.values = this.values.map(this.getOptionData).filter(Boolean);
721 732 this.hasExpectedValue = false;
722 733 }
... ...