react-google-maps 在 StrictMode 下不会卸载组件
react-google-maps doesn't unmount components when under StrictMode
在附加的示例代码和框中,我有一个使用 react-google-maps
的地图。
当用 <React.StrictMode>
包裹地图时,它将停止卸载组件。
我看到 react-google-maps 卸载组件的方式通常是使用 instance.setMap(null)
将它们的映射设置为 null。我不明白为什么这种行为会在 StrictMode
.
下中断
这是演示问题的代码和框:
https://codesandbox.io/s/jv61orz64y
谢谢!
乌里
我遇到了同样的问题,在回购协议中遇到了你的问题,因此遇到了这个问题。我已经详细介绍了这个问题 a comment on your repo issue,但总结一下:
- react-google-maps 有点调皮,实际上在组件的构造函数中做了一些类似渲染的工作。在本例中,它初始化 google.maps.Marker 并调用
setMap
。这具有将标记放在地图上的效果。
- 它从
componentWillUnmount
中的地图中移除标记
- 一个组件 可能 被构造但永远不会最终成为
mounted
,当这种情况发生时,componentWillUnmount
永远不会被调用,因为没有任何要卸载的东西
- 这意味着如果组件已构建但从未安装,因此从未调用
componentWillUnmount
,则标记永远不会从地图中移除
- 在 StrictMode 中,这种情况似乎会发生,请参阅下面的解释:
如果您查看 my fork of your demo,您会看到在非严格模式下,标记代理 (MyMarker) 被构建、安装、更新、卸载,然后如果您加载页面放大和重新安装然后缩小。然而,在严格模式下,构建了两个标记,但只安装了一个。所以这里发生的事情并不是在您放大时标记永远不会卸载,而是地图上始终有两个标记。一个通过构建但从未安装在地图上的 "orphaned",以及一个完全在 React 控制下的。它确实正在被正确删除和重新添加。
在附加的示例代码和框中,我有一个使用 react-google-maps
的地图。
当用 <React.StrictMode>
包裹地图时,它将停止卸载组件。
我看到 react-google-maps 卸载组件的方式通常是使用 instance.setMap(null)
将它们的映射设置为 null。我不明白为什么这种行为会在 StrictMode
.
这是演示问题的代码和框: https://codesandbox.io/s/jv61orz64y
谢谢!
乌里
我遇到了同样的问题,在回购协议中遇到了你的问题,因此遇到了这个问题。我已经详细介绍了这个问题 a comment on your repo issue,但总结一下:
- react-google-maps 有点调皮,实际上在组件的构造函数中做了一些类似渲染的工作。在本例中,它初始化 google.maps.Marker 并调用
setMap
。这具有将标记放在地图上的效果。 - 它从
componentWillUnmount
中的地图中移除标记
- 一个组件 可能 被构造但永远不会最终成为
mounted
,当这种情况发生时,componentWillUnmount
永远不会被调用,因为没有任何要卸载的东西 - 这意味着如果组件已构建但从未安装,因此从未调用
componentWillUnmount
,则标记永远不会从地图中移除 - 在 StrictMode 中,这种情况似乎会发生,请参阅下面的解释:
如果您查看 my fork of your demo,您会看到在非严格模式下,标记代理 (MyMarker) 被构建、安装、更新、卸载,然后如果您加载页面放大和重新安装然后缩小。然而,在严格模式下,构建了两个标记,但只安装了一个。所以这里发生的事情并不是在您放大时标记永远不会卸载,而是地图上始终有两个标记。一个通过构建但从未安装在地图上的 "orphaned",以及一个完全在 React 控制下的。它确实正在被正确删除和重新添加。