11const React = window . React ;
2+ const ReactDOM = window . ReactDOM ;
23
3- const Rectangle = ( { style, ...props } ) => (
4- < div { ...props } style = { { border : '1px solid black' , padding : 40 , ...style } } />
4+ const Rectangle = ( { style, nodeRef, ...props } ) => (
5+ < div
6+ { ...props }
7+ ref = { nodeRef }
8+ style = { { border : '1px solid black' , padding : 40 , ...style } }
9+ />
510) ;
611
12+ var portalContainer = document . createElement ( 'div' ) ;
13+ document . body . appendChild ( portalContainer )
14+
15+
716class MouseEventsFixtures extends React . Component {
8- state = { log : [ ] } ;
17+ state = { log : [ ] , box : null } ;
918
1019 log = msg => {
1120 this . setState ( ( { log} ) => ( {
@@ -15,7 +24,28 @@ class MouseEventsFixtures extends React.Component {
1524 clearLog = ( ) => {
1625 this . setState ( { log : [ ] } ) ;
1726 } ;
27+
28+ componentDidMount ( ) {
29+ this . getDimensions ( )
30+ }
31+ componentDidUpdate ( ) {
32+ this . getDimensions ( )
33+ }
34+
35+ getDimensions ( ) {
36+ if ( ! this . state . box && this . node ) {
37+ const { left, bottom } = this . node . getBoundingClientRect ( )
38+ this . setState ( {
39+ box : { left : left + 10 , top : bottom - 10 } ,
40+ } )
41+ } else if ( this . state . box && ! this . node ) {
42+ this . setState ( { box : null } )
43+ }
44+ }
45+
1846 render ( ) {
47+ const { box } = this . state ;
48+
1949 let getLogger = prefix => e => this . log ( `${ prefix } : ${ e . type } ` ) ;
2050 let outerLogger = getLogger ( 'outer' ) ;
2151 let innerLogger = getLogger ( 'inner' ) ;
@@ -35,8 +65,31 @@ class MouseEventsFixtures extends React.Component {
3565 < Rectangle onMouseEnter = { outerLogger } onMouseLeave = { outerLogger } >
3666 < Rectangle onMouseEnter = { innerLogger } onMouseLeave = { innerLogger } />
3767 </ Rectangle >
68+
69+ < p >
70+ Moving from the outer rectangle to the inner blue Portal should not trigger a
71+ mouseleave on the outer rectangle.
72+ </ p >
73+ < Rectangle
74+ onMouseEnter = { outerLogger }
75+ onMouseLeave = { outerLogger }
76+ nodeRef = { n => this . node = n }
77+ >
78+
79+ { ReactDOM . unstable_createPortal (
80+ < div
81+ style = { { position : 'fixed' , border : '1px solid blue' , padding : 10 , ...box } }
82+ onMouseEnter = { innerLogger }
83+ onMouseLeave = { innerLogger }
84+ >
85+ portal
86+ </ div > ,
87+ portalContainer ,
88+ ) }
89+ </ Rectangle >
3890 </ div >
3991
92+
4093 < div className = "container" >
4194 < h4 > Console: < button onClick = { this . clearLog } > clear</ button > </ h4 >
4295 < pre className = "output" >
0 commit comments