【问题标题】:Google is undefined: How to check if google maps script is loaded in React谷歌未定义:如何检查是否在 React 中加载了谷歌地图脚本
【发布时间】:2018-10-20 06:49:58
【问题描述】:

当我在我的 React 项目中加载包含地图的组件时,有时会收到“google is undefined”。原因似乎是在互联网连接不够好的情况下,google api脚本没有及时加载。

我正在像这样在 app.js 中加载地图 api 脚本。

componentWillMount() {
    const API_KEY = process.env.GOOGLEMAP_API_KEY;
    const script = document.createElement('script');
    script.src = `https://maps.googleapis.com/maps/api/js?key=${API_KEY}`;
    script.async = true;
    script.defer = true;
    document.head.append(script);
  }

有没有办法在返回 renderApp 之前检查谷歌地图脚本是否已加载或在应用程序的其他地方使用检查?我曾尝试使用 typeOf google 和 typeOf google.maps,但它们只是返回未定义。

renderApp() {
      return (
        <div>
          <Header />
          <Main />
        </div>
      );
  }

render() {
    return (
      <div>
        {this.renderApp()}
      </div>
    );
  }

除了使用库 react-async-script-loader 之外,我如何在渲染组件之前检查谷歌地图是否可用。 React-async-script-loader 可能是解决方案,但它需要对我的地图组件进行一些重大改造。

我在网上找到了一些讨论,但似乎没有任何效果。

【问题讨论】:

  • 你能把load监听器附加到script吗?

标签: javascript reactjs google-maps


【解决方案1】:

您可以在 url 中传递一个回调参数。加载异步文件时会调用它。

当 API 准备就绪时,它将调用使用指定的函数 回调参数。

&callback=initMap

例子:

"https://maps.googleapis.com/maps/api/js?${API_KEY}&callback=initMap"

【讨论】:

  • 可以在 app.js 中定义 initMap 吗?我试过了,没有调用回调。如果我必须将另一个脚本附加到 index.html,该脚本中的变量是否可以全局使用?
  • 让它像window.initMap = this.yourFunc;一样全球化,这应该可以帮助你klaasnotfound.com/2016/11/06/making-google-maps-work-with-react
  • 谢谢,它有效。我之前确实遇到过你的解决方案,但是因为我读到它有 SSR 问题,所以就通过了它,但现在它可以工作,因为我没有做 SSR。
  • 回调参数不是很有帮助,因为它不能调用在任何框架深处编写的作用域函数..
  • @vsync 你不应该对此投反对票,cb 就是这样设计的,地图库不知道你的代码是如何作用域的。 cb 它不是我定义的,它是由谷歌暴露的,可能是谷歌不了解它并且做错了:\
猜你喜欢
  • 1970-01-01
  • 2010-10-24
  • 2018-05-13
  • 2020-09-20
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多