5151 <div :class =" classes(n('label'), [filterable && showMenu, n('label-focusing')])" >
5252 <slot v-if =" !isEmptyModelValue" name =" selected" >
5353 <template v-if =" multiple " >
54- <div v-if =" chip" ref = " inputHost " :class =" n('chips')" >
54+ <div v-if =" chip" :class =" n('chips')" >
5555 <var-chip
5656 v-for =" l in labels"
5757 :key =" l"
6565 >
6666 <maybe-v-node :is =" l" />
6767 </var-chip >
68+ <var-select-input
69+ v-if =" showInput"
70+ ref =" inputRef"
71+ v-model =" query"
72+ :style =" inputStyle"
73+ multiple
74+ @focus =" handleFocus"
75+ @blur =" handleRootBlur"
76+ @input =" handleInput"
77+ @compositionstart =" handleCompositionStart"
78+ @compositionend =" handleCompositionEnd"
79+ />
6880 </div >
69- <div v-else ref = " inputHost " :class =" n('values')" >
81+ <div v-else :class =" n('values')" >
7082 <template v-for =" (l , labelIndex ) in labels " :key =" l " >
7183 <maybe-v-node :is =" l" />{{ labelIndex !== labels.length - 1 ? separator : '' }}
7284 </template >
85+ <var-select-input
86+ v-if =" showInput"
87+ ref =" inputRef"
88+ v-model =" query"
89+ :style =" inputStyle"
90+ multiple
91+ @focus =" handleFocus"
92+ @blur =" handleRootBlur"
93+ @input =" handleInput"
94+ @compositionstart =" handleCompositionStart"
95+ @compositionend =" handleCompositionEnd"
96+ />
7397 </div >
7498 </template >
7599
76100 <maybe-v-node :is =" label" v-else-if =" !query && !isComposing" />
77101 </slot >
78102 </div >
79103
80- <teleport v-if =" filterable && !readonly && !disabled" :to =" inputHost" :disabled =" !inputHost" >
81- <input
82- ref =" inputRef"
83- v-model =" query"
84- type =" text"
85- :class =" classes(n('input'), [multiple, n('input--multiple')])"
86- @input =" handleInput"
87- @focus =" handleFocus"
88- @blur =" handleRootBlur"
89- @compositionstart =" handleCompositionStart"
90- @compositionend =" handleCompositionEnd"
91- />
92- </teleport >
104+ <var-select-input
105+ v-if =" showInput && (!multiple || isEmptyModelValue)"
106+ ref =" inputRef"
107+ v-model =" query"
108+ :style =" inputStyle"
109+ @focus =" handleFocus"
110+ @blur =" handleRootBlur"
111+ @input =" handleInput"
112+ @compositionstart =" handleCompositionStart"
113+ @compositionend =" handleCompositionEnd"
114+ />
93115 <span
94116 v-if =" enableCustomPlaceholder && !query"
95117 :class =" classes(n('placeholder'), n('$--ellipsis'))"
@@ -159,6 +181,7 @@ import { createNamespace, MaybeVNode, useValidation } from '../utils/components'
159181import { focusChildElementByKey , toPxNum } from ' ../utils/elements'
160182import { props , type SelectValidateTrigger } from ' ./props'
161183import { useOptions , type SelectProvider } from ' ./provide'
184+ import VarSelectInput from ' ./SelectInput.vue'
162185import { useCalcInputWidth } from ' ./useCalcInputWidth'
163186import { useSelectController } from ' ./useSelectController'
164187
@@ -173,15 +196,15 @@ export default defineComponent({
173196 VarOption ,
174197 VarFieldDecorator ,
175198 VarFormDetails ,
199+ VarSelectInput ,
176200 MaybeVNode ,
177201 },
178202 props ,
179203 setup(props ) {
180204 const isFocusing = ref (false )
181205 const showMenu = ref (false )
182206 const root = ref <HTMLElement | null >(null )
183- const inputRef = ref <HTMLInputElement | null >(null )
184- const inputHost = ref ()
207+ const inputRef = ref <InstanceType <typeof VarSelectInput > | null >(null )
185208 const query = ref (' ' )
186209 const isComposing = ref (false )
187210 const filterable = computed (() => props .filterable )
@@ -237,7 +260,8 @@ export default defineComponent({
237260 }
238261 return props .tabindex ?? ' 0'
239262 })
240- const { calculatorRef, inputStyle } = useCalcInputWidth (filterable )
263+ const showInput = computed (() => filterable .value && ! readonly .value && ! disabled .value )
264+ const { calculatorRef, inputStyle } = useCalcInputWidth (query )
241265
242266 const selectProvider: SelectProvider = {
243267 query: computed (() => query .value ),
@@ -359,10 +383,13 @@ export default defineComponent({
359383 }
360384
361385 function handleRootFocus(e : FocusEvent ) {
362- if (inputRef .value ?.contains (e .relatedTarget as Element | null )) {
386+ const el = inputRef .value ?.$el
387+
388+ if (el ?.contains (e .relatedTarget as Element | null )) {
363389 inputRef .value ?.focus ()
364390 return
365391 }
392+
366393 handleFocus ()
367394 }
368395
@@ -491,7 +518,6 @@ export default defineComponent({
491518 return {
492519 root ,
493520 inputRef ,
494- inputHost ,
495521 calculatorRef ,
496522 isComposing ,
497523 inputStyle ,
@@ -502,6 +528,7 @@ export default defineComponent({
502528 offsetY ,
503529 isFocusing ,
504530 showMenu ,
531+ showInput ,
505532 errorMessage ,
506533 formDisabled: form ?.disabled ,
507534 formReadonly: form ?.readonly ,
0 commit comments