Skip to content

Commit 380fcd4

Browse files
authored
fix(Select): dropdownRender inside dropdown box disappears when the input box gains focus (#7020)
Co-authored-by: undefined <undefined>
1 parent 4a1296b commit 380fcd4

File tree

2 files changed

+33
-16
lines changed

2 files changed

+33
-16
lines changed

components/select/demo/custom-dropdown-menu.vue

+21-12
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,22 @@ Customize the dropdown menu via `dropdownRender`.
1919
<template>
2020
<a-select
2121
v-model:value="value"
22-
style="width: 120px"
22+
placeholder="custom dropdown render"
23+
style="width: 300px"
2324
:options="items.map(item => ({ value: item }))"
2425
>
2526
<template #dropdownRender="{ menuNode: menu }">
2627
<v-nodes :vnodes="menu" />
2728
<a-divider style="margin: 4px 0" />
28-
<div
29-
style="padding: 4px 8px; cursor: pointer"
30-
@mousedown="e => e.preventDefault()"
31-
@click="addItem"
32-
>
33-
<plus-outlined />
34-
Add item
35-
</div>
29+
<a-space style="padding: 4px 8px">
30+
<a-input ref="inputRef" v-model:value="name" placeholder="Please enter item" />
31+
<a-button type="text" @click="addItem">
32+
<template #icon>
33+
<plus-outlined />
34+
</template>
35+
Add item
36+
</a-button>
37+
</a-space>
3638
</template>
3739
</a-select>
3840
</template>
@@ -54,10 +56,17 @@ const VNodes = defineComponent({
5456
5557
let index = 0;
5658
const items = ref(['jack', 'lucy']);
57-
const value = ref('lucy');
59+
const value = ref();
60+
const inputRef = ref();
61+
const name = ref();
5862
59-
const addItem = () => {
63+
const addItem = e => {
64+
e.preventDefault();
6065
console.log('addItem');
61-
items.value.push(`New item ${(index += 1)}`);
66+
items.value.push(name.value || `New item ${(index += 1)}`);
67+
name.value = '';
68+
setTimeout(() => {
69+
inputRef.value?.focus();
70+
}, 0);
6271
};
6372
</script>

components/vc-select/BaseSelect.tsx

+12-4
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import {
2727
toRefs,
2828
watch,
2929
watchEffect,
30+
ref,
3031
} from 'vue';
3132
import type { CSSProperties, ExtractPropTypes, PropType } from 'vue';
3233
import PropTypes from '../_util/vue-types';
@@ -280,6 +281,7 @@ export default defineComponent({
280281
const triggerRef = shallowRef<RefTriggerProps>(null);
281282
const selectorRef = shallowRef<RefSelectorProps>(null);
282283
const listRef = shallowRef<RefOptionListProps>(null);
284+
const blurRef = ref<boolean>(false);
283285

284286
/** Used for component focused management */
285287
const [mockFocused, setMockFocused, cancelSetMockFocused] = useDelayReset();
@@ -339,10 +341,10 @@ export default defineComponent({
339341
const onToggleOpen = (newOpen?: boolean) => {
340342
const nextOpen = newOpen !== undefined ? newOpen : !mergedOpen.value;
341343

342-
if (innerOpen.value !== nextOpen && !props.disabled) {
344+
if (!props.disabled) {
343345
setInnerOpen(nextOpen);
344-
if (props.onDropdownVisibleChange) {
345-
props.onDropdownVisibleChange(nextOpen);
346+
if (mergedOpen.value !== nextOpen) {
347+
props.onDropdownVisibleChange && props.onDropdownVisibleChange(nextOpen);
346348
}
347349
}
348350
};
@@ -413,6 +415,9 @@ export default defineComponent({
413415
if (innerOpen.value && !!props.disabled) {
414416
setInnerOpen(false);
415417
}
418+
if (props.disabled && !blurRef.value) {
419+
setMockFocused(false);
420+
}
416421
},
417422
{ immediate: true },
418423
);
@@ -524,9 +529,12 @@ export default defineComponent({
524529
};
525530

526531
const onContainerBlur: FocusEventHandler = (...args) => {
532+
blurRef.value = true;
533+
527534
setMockFocused(false, () => {
528535
focusRef.value = false;
529-
onToggleOpen(false);
536+
blurRef.value = false;
537+
//onToggleOpen(false);
530538
});
531539

532540
if (props.disabled) {

0 commit comments

Comments
 (0)