@@ -60,7 +60,7 @@ export interface TooltipRef extends TriggerRef {}
6060
6161const Tooltip = React . forwardRef < TooltipRef , TooltipProps > ( ( props , ref ) => {
6262 const {
63- trigger = [ 'hover' ] ,
63+ trigger = [ 'hover' , 'focus' ] ,
6464 mouseEnterDelay = 0 ,
6565 mouseLeaveDelay = 0.1 ,
6666 prefixCls = 'rc-tooltip' ,
@@ -79,6 +79,7 @@ const Tooltip = React.forwardRef<TooltipRef, TooltipProps>((props, ref) => {
7979 showArrow = true ,
8080 classNames,
8181 styles,
82+ forceRender,
8283 ...restProps
8384 } = props ;
8485
@@ -93,6 +94,51 @@ const Tooltip = React.forwardRef<TooltipRef, TooltipProps>((props, ref) => {
9394 extraProps . popupVisible = props . visible ;
9495 }
9596
97+ const isControlled = 'visible' in props ;
98+ const mergedVisible = props . visible ;
99+ const [ popupMounted , setPopupMounted ] = React . useState ( ( ) => {
100+ if ( forceRender ) {
101+ return true ;
102+ }
103+ if ( isControlled ) {
104+ return mergedVisible ;
105+ }
106+ return defaultVisible ;
107+ } ) ;
108+
109+ const updatePopupMounted = React . useCallback (
110+ ( nextVisible : boolean ) => {
111+ setPopupMounted ( ( prev ) => {
112+ if ( nextVisible ) {
113+ return true ;
114+ }
115+
116+ if ( destroyOnHidden ) {
117+ return false ;
118+ }
119+
120+ return prev ;
121+ } ) ;
122+ } ,
123+ [ forceRender , destroyOnHidden ] ,
124+ ) ;
125+
126+ const handleVisibleChange = ( nextVisible : boolean ) => {
127+ updatePopupMounted ( nextVisible ) ;
128+ onVisibleChange ?.( nextVisible ) ;
129+ } ;
130+
131+ React . useEffect ( ( ) => {
132+ if ( forceRender ) {
133+ setPopupMounted ( true ) ;
134+ return ;
135+ }
136+
137+ if ( isControlled ) {
138+ setPopupMounted ( mergedVisible ) ;
139+ }
140+ } , [ forceRender , isControlled , mergedVisible ] ) ;
141+
96142 // ========================= Arrow ==========================
97143 // Process arrow configuration
98144 const mergedArrow = React . useMemo ( ( ) => {
@@ -118,7 +164,7 @@ const Tooltip = React.forwardRef<TooltipRef, TooltipProps>((props, ref) => {
118164 const originalProps = child ?. props || { } ;
119165 const childProps = {
120166 ...originalProps ,
121- 'aria-describedby' : overlay ? mergedId : null ,
167+ 'aria-describedby' : overlay && popupMounted ? mergedId : null ,
122168 } ;
123169 return React . cloneElement < any > ( children , childProps ) as any ;
124170 } ;
@@ -145,10 +191,11 @@ const Tooltip = React.forwardRef<TooltipRef, TooltipProps>((props, ref) => {
145191 ref = { triggerRef }
146192 popupAlign = { align }
147193 getPopupContainer = { getTooltipContainer }
148- onOpenChange = { onVisibleChange }
194+ onOpenChange = { handleVisibleChange }
149195 afterOpenChange = { afterVisibleChange }
150196 popupMotion = { motion }
151197 defaultPopupVisible = { defaultVisible }
198+ forceRender = { forceRender }
152199 autoDestroy = { destroyOnHidden }
153200 mouseLeaveDelay = { mouseLeaveDelay }
154201 popupStyle = { styles ?. root }
0 commit comments