From b121bb673e9dae5ae558c8c98218f7fc02029da2 Mon Sep 17 00:00:00 2001 From: Curtis Layne Date: Thu, 20 Sep 2018 13:20:22 -0400 Subject: [PATCH] Use React 16 portal to render map overlay (#643) * Use React 16 portal to render map overlay This allows the new context API to propagate context properly. * Rename div to overlay --- src/google_map.js | 54 +++++++++++++++++++++++++++-------------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/src/google_map.js b/src/google_map.js index 1a0bd80..dc525a7 100644 --- a/src/google_map.js +++ b/src/google_map.js @@ -239,7 +239,7 @@ export default class GoogleMap extends Component { this.zoomAnimationInProgress_ = false; this.state = { - overlayCreated: false, + overlay: null, }; } @@ -587,7 +587,7 @@ export default class GoogleMap extends Component { : '2000px'; const div = document.createElement('div'); - this.div = div; + this.overlay = div; div.style.backgroundColor = 'transparent'; div.style.position = 'absolute'; div.style.left = '0px'; @@ -601,29 +601,21 @@ export default class GoogleMap extends Component { maps, overlay.getProjection() ); - ReactDOM.unstable_renderSubtreeIntoContainer( - this_, - , - div, - // remove prerendered markers - () => this_.setState({ overlayCreated: true }) - ); + + this_.setState(state => ({ + ...state, + overlay: div, + })); }, onRemove() { - if (this.div) { - ReactDOM.unmountComponentAtNode(this.div); + this_.setState(state => ({ + ...state, + overlay: null, + })); + + if (this.overlay) { + ReactDOM.unmountComponentAtNode(this.overlay); } }, @@ -1062,7 +1054,7 @@ export default class GoogleMap extends Component { }; render() { - const mapMarkerPrerender = !this.state.overlayCreated + const mapMarkerPrerender = !this.state.overlay ? + {this.state.overlay && + ReactDOM.createPortal( + , + this.state.overlay + )} {/* render markers before map load done */} {mapMarkerPrerender}