UNPKG

800 BJavaScriptView Raw
1import React from 'react';
2import ReactDOM from 'react-dom';
3import PropTypes from 'prop-types';
4import { canUseDOM } from './utils';
5
6const propTypes = {
7 children: PropTypes.node.isRequired,
8 node: PropTypes.any
9};
10
11class Portal extends React.Component {
12 componentWillUnmount() {
13 if (this.defaultNode) {
14 document.body.removeChild(this.defaultNode);
15 }
16 this.defaultNode = null;
17 }
18
19 render() {
20 if (!canUseDOM) {
21 return null;
22 }
23
24 if (!this.props.node && !this.defaultNode) {
25 this.defaultNode = document.createElement('div');
26 document.body.appendChild(this.defaultNode);
27 }
28
29 return ReactDOM.createPortal(
30 this.props.children,
31 this.props.node || this.defaultNode
32 );
33 }
34}
35
36Portal.propTypes = propTypes;
37
38export default Portal;