@@ -7,11 +7,12 @@ import { isString, isUndefined } from 'lodash';
77import React , { useEffect , useImperativeHandle , useRef , useState } from 'react' ;
88import ReactDOM from 'react-dom' ;
99
10- import { useEventCallback , useId , useLockScroll , useRefExtra } from '@react-devui/hooks' ;
10+ import { useEvent , useEventCallback , useId , useLockScroll , useRefExtra } from '@react-devui/hooks' ;
1111import { getClassName , getPopupPosition } from '@react-devui/utils' ;
1212
1313import { useMaxIndex , useDValue } from '../../hooks' ;
14- import { registerComponentMate , handleModalKeyDown , cloneHTMLElement } from '../../utils' ;
14+ import { registerComponentMate , handleModalKeyDown , cloneHTMLElement , checkNoExpandedEl } from '../../utils' ;
15+ import { EXPANDED_DATA } from '../../utils/checkNoExpandedEl' ;
1516import { DPopup } from '../_popup' ;
1617import { DTransition } from '../_transition' ;
1718import { useComponentConfig , usePrefixConfig } from '../root' ;
@@ -76,6 +77,7 @@ function Popover(props: DPopoverProps, ref: React.ForwardedRef<DPopoverRef>): JS
7677 //#endregion
7778
7879 //#region Ref
80+ const windowRef = useRefExtra ( ( ) => window ) ;
7981 const triggerRef = useRefExtra ( ( ) => document . getElementById ( triggerId ) ) ;
8082 const popoverRef = useRef < HTMLDivElement > ( null ) ;
8183 const popupRef = useRef < HTMLDivElement > ( null ) ;
@@ -232,6 +234,17 @@ function Popover(props: DPopoverProps, ref: React.ForwardedRef<DPopoverRef>): JS
232234 } ) ;
233235
234236 useLockScroll ( dModal && visible ) ;
237+ useEvent < KeyboardEvent > (
238+ windowRef ,
239+ 'keydown' ,
240+ ( e ) => {
241+ if ( e . code === 'Escape' && popoverRef . current && checkNoExpandedEl ( popoverRef . current ) ) {
242+ changeVisible ( false ) ;
243+ }
244+ } ,
245+ { } ,
246+ ! dEscClosable || ! visible
247+ ) ;
235248
236249 useEffect ( ( ) => {
237250 if ( dModal ) {
@@ -271,7 +284,6 @@ function Popover(props: DPopoverProps, ref: React.ForwardedRef<DPopoverRef>): JS
271284 < DPopup
272285 dVisible = { visible }
273286 dTrigger = { dTrigger }
274- dEscClosable = { dEscClosable }
275287 dMouseEnterDelay = { dMouseEnterDelay }
276288 dMouseLeaveDelay = { dMouseLeaveDelay }
277289 dUpdatePosition = { {
@@ -287,6 +299,7 @@ function Popover(props: DPopoverProps, ref: React.ForwardedRef<DPopoverRef>): JS
287299 { renderTrigger (
288300 cloneHTMLElement ( children , {
289301 id : triggerId ,
302+ [ EXPANDED_DATA ] : visible ,
290303 } )
291304 ) }
292305 { containerRef . current &&
0 commit comments