Skip to content

Commit 497e909

Browse files
committed
fix(select): add showMenu to SelectProvider and update visibility logic
1 parent bfe8264 commit 497e909

4 files changed

Lines changed: 23 additions & 10 deletions

File tree

packages/varlet-ui/src/option/Option.vue

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,11 +82,14 @@ export default defineComponent({
8282
const disabled = computed(() => props.disabled)
8383
const ripple = computed(() => props.ripple)
8484
const { select, bindSelect } = useSelect()
85-
const { pattern, filter, filterable, multiple, focusColor, onSelect, computeLabel } = select
85+
const { pattern, showMenu, filter, filterable, multiple, focusColor, onSelect, computeLabel } = select
8686
const { hovering, handleHovering } = useHoverOverlay()
87-
8887
const labelVNode = computed<any>(() => (isFunction(props.label) ? option.value : props.label))
89-
const visible = computed(() => !filterable.value || !pattern.value || filter.value(pattern.value, option.value))
88+
const frozenVisible = ref(true)
89+
const visibleByFilter = computed(
90+
() => !filterable.value || !pattern.value || filter.value(pattern.value, option.value),
91+
)
92+
const visible = computed(() => (showMenu.value ? visibleByFilter.value : frozenVisible.value))
9093
9194
const optionProvider: OptionProvider = {
9295
label: labelVNode,
@@ -99,6 +102,16 @@ export default defineComponent({
99102
100103
watch([() => props.label, () => props.value], computeLabel)
101104
105+
watch(
106+
() => [showMenu.value, visibleByFilter.value] as const,
107+
() => {
108+
if (showMenu.value) {
109+
frozenVisible.value = visibleByFilter.value
110+
}
111+
},
112+
{ immediate: true },
113+
)
114+
102115
bindSelect(optionProvider)
103116
104117
useEventListener(() => window, 'keydown', handleKeydown)

packages/varlet-ui/src/select/Select.vue

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@
170170

171171
<script lang="ts">
172172
import { computed, defineComponent, nextTick, ref, watch } from 'vue'
173-
import { assert, call, doubleRaf, isArray, isEmpty, isFunction, preventDefault } from '@varlet/shared'
173+
import { assert, call, isArray, isEmpty, isFunction, preventDefault } from '@varlet/shared'
174174
import { useEventListener } from '@varlet/use'
175175
import VarChip from '../chip'
176176
import VarFieldDecorator from '../field-decorator'
@@ -283,6 +283,7 @@ export default defineComponent({
283283
284284
const selectProvider: SelectProvider = {
285285
pattern: computed(() => pattern.value),
286+
showMenu: computed(() => showMenu.value),
286287
multiple,
287288
filterable,
288289
filter,
@@ -471,10 +472,8 @@ export default defineComponent({
471472
472473
if (!multiple) {
473474
root.value!.focus()
474-
doubleRaf().then(() => {
475-
showMenu.value = false
476-
pattern.value = ''
477-
})
475+
showMenu.value = false
476+
pattern.value = ''
478477
}
479478
}
480479

packages/varlet-ui/src/select/provide.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export const SELECT_BIND_OPTION_KEY = Symbol('SELECT_BIND_OPTION_KEY')
88

99
export interface SelectProvider extends Validation {
1010
pattern: ComputedRef<string>
11+
showMenu: ComputedRef<boolean>
1112
multiple: ComputedRef<boolean>
1213
filterable: ComputedRef<boolean>
1314
filter: ComputedRef<FilterMethod>

packages/varlet-ui/types/select.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export type SelectOptionLabelRender = (option: SelectOption, checked: boolean) =
2020

2121
export type SelectOptionLabel = string | VNode | SelectOptionLabelRender
2222

23-
export type FilterMethod = (pattern: string, option: SelectOption) => boolean
23+
export type SelectFilterMethod = (pattern: string, option: SelectOption) => boolean
2424

2525
export interface SelectOption {
2626
label?: SelectOptionLabel
@@ -55,7 +55,7 @@ export interface SelectProps extends BasicAttributes {
5555
rules?: SelectRules
5656
tabindex?: SelectHTMLAttributes['tabindex']
5757
filterable?: boolean
58-
filter?: FilterMethod
58+
filter?: SelectFilterMethod
5959
onFocus?: ListenerProp<(e: Event) => void>
6060
onBlur?: ListenerProp<(e: Event) => void>
6161
onClick?: ListenerProp<(e: Event) => void>

0 commit comments

Comments
 (0)