diff --git a/src/components/select/functional-options.vue b/src/components/select/functional-options.vue index 39783bd7..a3197096 100644 --- a/src/components/select/functional-options.vue +++ b/src/components/select/functional-options.vue @@ -18,17 +18,11 @@ }, }, functional: true, - render(h, {props, parent}) { - // In order to response data changes,i do this hack. #4372 - if(props.slotOptions.length > 0) { - for(let i in props.slotOptions) { - if(props.slotOptions[i].key !== parent.$slots.default[i].key) { - props.slotUpdateHook(); - break; - } - } - } - if(props.slotOptions && parent.$slots.default && props.slotOptions.length !== parent.$slots.default.length) props.slotUpdateHook(); + render(h, {props, parent}){ + // to detect changes in the $slot children/options we do this hack + // so we can trigger the parents computed properties and have everything reactive + // although $slot.default is not + if (props.slotOptions !== parent.$slots.default) props.slotUpdateHook(); return props.options; } }; diff --git a/src/components/select/select.vue b/src/components/select/select.vue index 03e6e960..3857089a 100644 --- a/src/components/select/select.vue +++ b/src/components/select/select.vue @@ -356,12 +356,14 @@ }); }); } + let hasDefaultSelected = slotOptions.some(option => this.query === option.key); for (let option of slotOptions) { const cOptions = option.componentOptions; if (!cOptions) continue; if (cOptions.tag.match(optionGroupRegexp)){ let children = cOptions.children; + // remove filtered children if (this.filterable){ children = children.filter( @@ -378,8 +380,11 @@ if (cOptions.children.length > 0) selectOptions.push({...option}); } else { // ignore option if not passing filter - const optionPassesFilter = this.filterable ? this.validateOption(cOptions) : option; - if (!optionPassesFilter) continue; + if (!hasDefaultSelected) { + const optionPassesFilter = this.filterable ? this.validateOption(cOptions) : option; + if (!optionPassesFilter) continue; + } + optionCounter = optionCounter + 1; selectOptions.push(this.processOption(option, selectedValues, optionCounter === currentIndex)); } @@ -636,9 +641,6 @@ }, updateSlotOptions(){ this.slotOptions = this.$slots.default; - // #4372 issue, i find that this.query's value affects the judgment of the validateOption method. - this.query = ''; - this.focusIndex = -1; }, checkUpdateStatus() { if (this.getInitialValue().length > 0 && this.selectOptions.length === 0) {