【问题标题】:How to use gapi in react如何在反应中使用gapi
【发布时间】:2019-01-29 08:09:53
【问题描述】:

我想使用gapi从google访问people api资源,我尝试了很多方法来完成这项工作,但我仍然没有得到任何回应。它没有错误,没有警告。这是我的代码。

loadYoutubeApi() {
    const script = document.createElement("script");
    script.src = "https://apis.google.com/js/client.js";

    script.onload = () => {
      window.gapi.load('client', () => {
        window.gapi.client.setApiKey(types.API_KEY)
        window.gapi.client.setClientId(types.CLIENT_ID)
        window.gapi.client.setDiscoveryDocs(types.DISCOVERY_DOCS)
        window.gapi.client.setScope(types.SCOPE)
        window.gapi.client.load('client:auth2', 'v3', () => {
          console.log("gapi is ready")
          this.setState({ gapiReady: true });
        });
      });
    };

    document.body.appendChild(script);
  }

  componentDidMount() {
    this.loadYoutubeApi();
  }

谁能告诉我为什么我什至无法获取控制台日志信息,它真的有效吗?

更新:

一旦我把这些代码注释掉了

window.gapi.client.setClientId(types.CLIENT_ID)
window.gapi.client.setDiscoveryDocs(types.DISCOVERY_DOCS)
window.gapi.client.setScope

我可以获取我的控制台信息,是否与这些方法有关?

更新:

我可以获取 gapi 对象和console.log(window.gapi) 以查看其详细信息。

【问题讨论】:

  • @David Kamer 谢谢,我之前尝试过这些方法,但它们都不适合我
  • 如果您找不到我所说的文件夹,请告诉我。我知道直接将它添加到 index.html 文件中是可行的,因为这是我个人加载所有非反应脚本的方式。如果您一心想将其加载到组件中,您可以尝试在 onload 结束时添加 .call(),但我认为它不会起作用。

标签: javascript reactjs google-api google-api-js-client


【解决方案1】:

我为此做了一个自定义 Hook!

import { useEffect } from 'react';

const useGoogle = () => {

    useEffect(() => {

        const SCOPE = "TODO: your scope here";
        const handleClientLoad = () => window.gapi.load('client:auth2', initClient);
    
        const initClient = () => {
            const discoveryUrl = "TODO: your discoveryUrl here";
            window.gapi.client.init({
                'clientId': "TODO: your client id here",
                'discoveryDocs': [discoveryUrl],
                'scope': SCOPE
            });
            console.log("Google loaded");
        };

        const script = document.createElement('script');

        script.src = "https://apis.google.com/js/api.js";
        script.async = true;
        script.defer = true;
        script.onload = handleClientLoad;

        document.body.appendChild(script);

        return () => {
            document.body.removeChild(script);
        };

    }, []);
};

export default useGoogle;

【讨论】:

    【解决方案2】:

    尝试在我的 react 项目中添加 gapi 时遇到了很多问题。我发现的所有包都过时了,所以我创建了一个新包。

    gapi-script 允许您添加 gapi:

    import { gapi } from 'gapi-script'
    

    【讨论】:

    • 这个库破坏了我的 webpack,不知道该怎么办
    【解决方案3】:

    假设您使用的是 create-react-app 并且您已为 webpack 配置了一个公共 HTML 文件夹,那么您将需要放置脚本标签。

    您可能在某些文本编辑器项目树中看不到您的公用文件夹,但您会在操作系统文件浏览器中看到它。只需转到公用文件夹并使用以下行编辑 index.html:

    <script src="https://apis.google.com/js/client.js"></script>
    

    就在结束 &lt;/head&gt; 标记的正上方。无论如何,您正在使用当前代码间接执行此操作。您可以删除:

     const script = document.createElement("script");
     script.src = "https://apis.google.com/js/client.js";
    

    onload 调用,将所有api 对象调用(以window 作为基础对象)放在componentDidMount() 方法中。您不必担心它会被加载,因为您的组件只能在所有内容加载后才能安装。

    另外,不要担心它会减慢任何速度或在需要之前加载脚本。当您在生产前运行npm run build 时,无论如何您都会将所有内容压缩成几个文件。

    编辑:

    您应该将您的 onload 呼叫更改为 addEventListener('load', callback);

    【讨论】:

    • 还可以在公共目录中的清单中弹出一个很酷的奖励文件来修复您的应用程序!
    • 不,我可以得到gapi包,一旦我console.log(window.gapi)就可以看到对象的详细信息。问题是一旦我设置了我的 clientId、discoveryDoc 和 scope,我就无法得到响应。
    • 您是否将请求视为异步承诺?
    • 是的,那么我应该如何添加同步以便它可以等到gapi包完全初始化
    • 又看了一遍,有没有试过改成添加到index.html文件中?如果它没有完全初始化,那将解决问题。
    猜你喜欢
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 2021-12-20
    • 2020-09-16
    • 2019-06-12
    • 2020-04-24
    • 2021-12-15
    相关资源
    最近更新 更多