@@ -44,19 +44,34 @@ const Tooltip = ({
44
44
const [ inlineStyles , setInlineStyles ] = useState ( { } )
45
45
const [ inlineArrowStyles , setInlineArrowStyles ] = useState ( { } )
46
46
const [ show , setShow ] = useState ( false )
47
+ const [ rendered , setRendered ] = useState ( false )
47
48
const wasShowing = useRef ( false )
48
49
const [ calculatingPosition , setCalculatingPosition ] = useState ( false )
49
50
const lastFloatPosition = useRef < IPosition | null > ( null )
50
51
const { anchorRefs, setActiveAnchor : setProviderActiveAnchor } = useTooltip ( id )
51
52
const [ activeAnchor , setActiveAnchor ] = useState < React . RefObject < HTMLElement > > ( { current : null } )
52
53
const hoveringTooltip = useRef ( false )
53
54
54
- const handleShow = ( value : boolean ) => {
55
- if ( setIsOpen ) {
56
- setIsOpen ( value )
57
- } else if ( isOpen === undefined ) {
58
- setShow ( value )
55
+ useEffect ( ( ) => {
56
+ if ( ! show ) {
57
+ setRendered ( false )
59
58
}
59
+ } , [ show ] )
60
+
61
+ const handleShow = ( value : boolean ) => {
62
+ setRendered ( true )
63
+
64
+ /**
65
+ * this `timeout` is necessary because the component
66
+ * needs to be rendered to calculate the position correctly
67
+ */
68
+ setTimeout ( ( ) => {
69
+ if ( setIsOpen ) {
70
+ setIsOpen ( value )
71
+ } else if ( isOpen === undefined ) {
72
+ setShow ( value )
73
+ }
74
+ } , 10 )
60
75
}
61
76
62
77
useEffect ( ( ) => {
@@ -386,13 +401,19 @@ const Tooltip = ({
386
401
} , [ ] )
387
402
388
403
const hasContentOrChildren = Boolean ( html || content || children )
404
+ const canShow = Boolean (
405
+ hasContentOrChildren &&
406
+ ! calculatingPosition &&
407
+ ( isOpen || show ) &&
408
+ Object . keys ( inlineStyles ) . length > 0 ,
409
+ )
389
410
390
- return (
411
+ return rendered ? (
391
412
< WrapperElement
392
413
id = { id }
393
414
role = "tooltip"
394
415
className = { classNames ( 'react-tooltip' , styles [ 'tooltip' ] , styles [ variant ] , className , {
395
- [ styles [ 'show' ] ] : hasContentOrChildren && ! calculatingPosition && ( isOpen || show ) ,
416
+ [ styles [ 'show' ] ] : canShow ,
396
417
[ styles [ 'fixed' ] ] : positionStrategy === 'fixed' ,
397
418
[ styles [ 'clickable' ] ] : clickable ,
398
419
} ) }
@@ -409,7 +430,7 @@ const Tooltip = ({
409
430
ref = { tooltipArrowRef }
410
431
/>
411
432
</ WrapperElement >
412
- )
433
+ ) : null
413
434
}
414
435
415
436
export default Tooltip
0 commit comments