51 lines
920 B
JavaScript
51 lines
920 B
JavaScript
|
import { Component } from "react";
|
||
|
import PropTypes from "prop-types";
|
||
|
import ReactDOM from "react-dom";
|
||
|
|
||
|
class Portal extends Component {
|
||
|
constructor(props) {
|
||
|
super(props);
|
||
|
|
||
|
this.state = {
|
||
|
mounted: props.visible,
|
||
|
};
|
||
|
}
|
||
|
|
||
|
domExist() {
|
||
|
return !!(
|
||
|
typeof window !== undefined &&
|
||
|
window.document &&
|
||
|
window.document.createElement
|
||
|
);
|
||
|
}
|
||
|
|
||
|
componentDidMount() {
|
||
|
if (this.domExist() && !this.state.mounted) {
|
||
|
this.setState({ mounted: true });
|
||
|
}
|
||
|
}
|
||
|
|
||
|
render() {
|
||
|
return this.props.element && this.state.mounted
|
||
|
? ReactDOM.createPortal(
|
||
|
this.props.element,
|
||
|
this.props.appendTo || document.body
|
||
|
)
|
||
|
: null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
Portal.propTypes = {
|
||
|
element: PropTypes.any,
|
||
|
appendTo: PropTypes.any,
|
||
|
visible: PropTypes.bool,
|
||
|
};
|
||
|
|
||
|
Portal.defaultProps = {
|
||
|
element: null,
|
||
|
appendTo: null,
|
||
|
visible: false,
|
||
|
};
|
||
|
|
||
|
export default Portal;
|