@@ -7,7 +7,7 @@ import { useAllowClear } from '../hooks/useAllowClear';
77import { BaseSelectContext } from '../hooks/useBaseProps' ;
88import type { BaseSelectContextProps } from '../hooks/useBaseProps' ;
99import useLock from '../hooks/useLock' ;
10- import useSelectTriggerControl from '../hooks/useSelectTriggerControl' ;
10+ import useSelectTriggerControl , { isInside } from '../hooks/useSelectTriggerControl' ;
1111import type {
1212 DisplayInfoType ,
1313 DisplayValueType ,
@@ -21,7 +21,7 @@ import type { RefTriggerProps } from '../SelectTrigger';
2121import SelectTrigger from '../SelectTrigger' ;
2222import { getSeparatedContent , isValidCount } from '../utils/valueUtil' ;
2323import Polite from './Polite' ;
24- import useOpen from '../hooks/useOpen' ;
24+ import useOpen , { macroTask } from '../hooks/useOpen' ;
2525import { useEvent } from '@rc-component/util' ;
2626import type { SelectInputRef } from '../SelectInput' ;
2727import SelectInput from '../SelectInput' ;
@@ -537,6 +537,15 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
537537 keyLockRef . current = false ;
538538 } ;
539539
540+ // ========================== Focus / Blur ==========================
541+ const getSelectElements = ( ) => [
542+ getDOM ( containerRef . current ) ,
543+ triggerRef . current ?. getPopupElement ( ) ,
544+ ] ;
545+
546+ // Close when click on non-select element
547+ useSelectTriggerControl ( getSelectElements , mergedOpen , triggerOpen , ! ! mergedComponents . root ) ;
548+
540549 // ========================== Focus / Blur ==========================
541550 /** Record real focus status */
542551 // const focusRef = React.useRef<boolean>(false);
@@ -554,6 +563,14 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
554563 }
555564 } ;
556565
566+ const onRootBlur = ( ) => {
567+ macroTask ( ( ) => {
568+ if ( ! isInside ( getSelectElements ( ) , document . activeElement as HTMLElement ) ) {
569+ triggerOpen ( false ) ;
570+ }
571+ } ) ;
572+ } ;
573+
557574 const onInternalBlur : React . FocusEventHandler < HTMLElement > = ( event ) => {
558575 setFocused ( false ) ;
559576
@@ -569,6 +586,8 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
569586 }
570587 }
571588
589+ onRootBlur ( ) ;
590+
572591 if ( ! disabled ) {
573592 onBlur ?.( event ) ;
574593 }
@@ -604,14 +623,6 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
604623 } ;
605624 }
606625
607- // Close when click on non-select element
608- useSelectTriggerControl (
609- ( ) => [ getDOM ( containerRef . current ) , triggerRef . current ?. getPopupElement ( ) ] ,
610- mergedOpen ,
611- triggerOpen ,
612- ! ! mergedComponents . root ,
613- ) ;
614-
615626 // ============================ Context =============================
616627 const baseSelectContext = React . useMemo < BaseSelectContextProps > (
617628 ( ) => ( {
@@ -764,6 +775,7 @@ const BaseSelect = React.forwardRef<BaseSelectRef, BaseSelectProps>((props, ref)
764775 onPopupVisibleChange = { onTriggerVisibleChange }
765776 onPopupMouseEnter = { onPopupMouseEnter }
766777 onPopupMouseDown = { onInternalMouseDown }
778+ onPopupBlur = { onRootBlur }
767779 >
768780 { renderNode }
769781 </ SelectTrigger >
0 commit comments