From 380fcd4aa97a0cee5f3d9991c2e30ee2291ac588 Mon Sep 17 00:00:00 2001 From: selicens <1244620067@qq.com> Date: Mon, 16 Oct 2023 15:03:37 +0800 Subject: [PATCH] fix(Select): dropdownRender inside dropdown box disappears when the input box gains focus (#7020) Co-authored-by: undefined --- .../select/demo/custom-dropdown-menu.vue | 33 ++++++++++++------- components/vc-select/BaseSelect.tsx | 16 ++++++--- 2 files changed, 33 insertions(+), 16 deletions(-) diff --git a/components/select/demo/custom-dropdown-menu.vue b/components/select/demo/custom-dropdown-menu.vue index d643ce8a2..707d9f97e 100644 --- a/components/select/demo/custom-dropdown-menu.vue +++ b/components/select/demo/custom-dropdown-menu.vue @@ -19,20 +19,22 @@ Customize the dropdown menu via `dropdownRender`. @@ -54,10 +56,17 @@ const VNodes = defineComponent({ let index = 0; const items = ref(['jack', 'lucy']); -const value = ref('lucy'); +const value = ref(); +const inputRef = ref(); +const name = ref(); -const addItem = () => { +const addItem = e => { + e.preventDefault(); console.log('addItem'); - items.value.push(`New item ${(index += 1)}`); + items.value.push(name.value || `New item ${(index += 1)}`); + name.value = ''; + setTimeout(() => { + inputRef.value?.focus(); + }, 0); }; diff --git a/components/vc-select/BaseSelect.tsx b/components/vc-select/BaseSelect.tsx index 7841ce8cd..39ffade25 100644 --- a/components/vc-select/BaseSelect.tsx +++ b/components/vc-select/BaseSelect.tsx @@ -27,6 +27,7 @@ import { toRefs, watch, watchEffect, + ref, } from 'vue'; import type { CSSProperties, ExtractPropTypes, PropType } from 'vue'; import PropTypes from '../_util/vue-types'; @@ -280,6 +281,7 @@ export default defineComponent({ const triggerRef = shallowRef(null); const selectorRef = shallowRef(null); const listRef = shallowRef(null); + const blurRef = ref(false); /** Used for component focused management */ const [mockFocused, setMockFocused, cancelSetMockFocused] = useDelayReset(); @@ -339,10 +341,10 @@ export default defineComponent({ const onToggleOpen = (newOpen?: boolean) => { const nextOpen = newOpen !== undefined ? newOpen : !mergedOpen.value; - if (innerOpen.value !== nextOpen && !props.disabled) { + if (!props.disabled) { setInnerOpen(nextOpen); - if (props.onDropdownVisibleChange) { - props.onDropdownVisibleChange(nextOpen); + if (mergedOpen.value !== nextOpen) { + props.onDropdownVisibleChange && props.onDropdownVisibleChange(nextOpen); } } }; @@ -413,6 +415,9 @@ export default defineComponent({ if (innerOpen.value && !!props.disabled) { setInnerOpen(false); } + if (props.disabled && !blurRef.value) { + setMockFocused(false); + } }, { immediate: true }, ); @@ -524,9 +529,12 @@ export default defineComponent({ }; const onContainerBlur: FocusEventHandler = (...args) => { + blurRef.value = true; + setMockFocused(false, () => { focusRef.value = false; - onToggleOpen(false); + blurRef.value = false; + //onToggleOpen(false); }); if (props.disabled) {