@@ -65,7 +65,7 @@ This includes event bubbling. An event fired from inside a portal will propagate
65
65
66
66
A ` Parent ` component in ` #app-root ` would be able to catch an uncaught, bubbling event from the sibling node ` #modal-root ` .
67
67
68
- ``` js{29-34,45-52,56,64-66,73-75,77 }
68
+ ``` js{28-31,42-49,53,61-63,70-71,74 }
69
69
// These two containers are siblings in the DOM
70
70
const appRoot = document.getElementById('app-root');
71
71
const modalRoot = document.getElementById('modal-root');
@@ -74,19 +74,18 @@ class Modal extends React.Component {
74
74
constructor(props) {
75
75
super(props);
76
76
this.el = document.createElement('div');
77
- // We need to keep track of when the portal element
78
- // is inserted in the DOM tree since we should only
79
- // render the modal's children on a mounted element
80
- this.state = {
81
- mounted: false
82
- };
83
77
}
84
78
85
79
componentDidMount() {
80
+ // The portal element is inserted in the DOM tree after
81
+ // the Modal's children are mounted, meaning that children
82
+ // will be mounted on a detached DOM node. If a child
83
+ // component requires to be attached to the DOM tree
84
+ // immediately when mounted, for example to measure a
85
+ // DOM node, or uses 'autoFocus' in a descendant, add
86
+ // state to Modal and only render the children when Modal
87
+ // is inserted in the DOM tree.
86
88
modalRoot.appendChild(this.el);
87
- this.setState({
88
- mounted: true
89
- });
90
89
}
91
90
92
91
componentWillUnmount() {
@@ -95,9 +94,7 @@ class Modal extends React.Component {
95
94
96
95
render() {
97
96
return ReactDOM.createPortal(
98
- // This will allow any children's 'componentDidMount()'
99
- // to be called on a mounted node
100
- this.state.mounted ? this.props.children : null,
97
+ this.props.children,
101
98
this.el,
102
99
);
103
100
}
0 commit comments