一旦加载外部js文件,React- only run file(gapi未定义)

时间:2016-11-15 14:03:13

标签: javascript reactjs gmail-api

我正在尝试将gmail API与React.js一起使用。

我一直收到错误' gapi未定义'。我相信在我的client.js文件运行后,HTML中的mail.js文件正在加载?

我怎样才能解决这个问题?

的index.html

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

Index.js

import './Mail.js';

在mail.js

import { createAction, handleActions } from 'redux-actions'

const CLIENT_ID = '1.apps.googleusercontent.com'
const SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']

export const SET_GMAIL_CREDENTIALS = 'SET_GMAIL_CREDENTIALS'
export const CHANGE_LOADING = 'CHANGE_LOADING'
export const SET_GMAIL_LABELS = 'SET_GMAIL_LABELS'
export const SELECT_GMAIL_LABEL = 'SELECT_GMAIL_LABEL'
export const SET_GMAIL_EMAILS = 'SET_GMAIL_EMAILS'

let defaultState = {
  profile: {
    emailAddress: ''
  },
  loading: true,
  labels: [],
  currentLabel: null,
  emails: []
}

export const connect = () => {
  return (dispatch, getState) => {
    dispatch(turnLoadingOn())
    gmailAuth(false, populateCredentials(dispatch), clearCredentials(dispatch))
  }
}...

2 个答案:

答案 0 :(得分:4)

我认为你是对的。我处理这些情况的方法是从React加载外部JS文件并在promise中使用它。

所以你的流程应该是这样的:

  1. 反应应用加载
  2. React app将您的文件注入HTML
  3. 在第2步的回调或.then()
  4. 中做你的事

    创建辅助函数。将它放在像helpers/load-script这样的文件夹中。您可以在下面找到该文件中应包含的所有代码:

    &#13;
    &#13;
    export default function loadScript(url, cb) {
    
          var scr = document.createElement('script');
          scr.type = 'text/javascript';
    
          if (scr.readyState) { // IE
            scr.onreadystatechange = function() {
              if (scr.readyState ==`loaded' || scr.readyState ==='complete') {
                scr.onreadystatechange = null;
                cb();
              }
            };
          } else { // Others
            scr.onload = cb;
          }
    
          script.src = url;
          document.getElementsByTagName('head')[0].appendChild(scr);
        }
    &#13;
    &#13;
    &#13;

    接下来,将要使用它的组件内的该函数导入:

    &#13;
    &#13;
    import React from 'react';
    import loadScript from 'helpers/load-script';
    
    class testComponent extends React.Component {
        
      componentDidMount() {
        loadScript('https://apis.google.com/js/client.js', () => {
        // do mail api stuff here               
        });
      }
       
      render() {
        return (
          <div>hi there</div>
        );
      }
    }
    
    export default testComponent;
    &#13;
    &#13;
    &#13;

答案 1 :(得分:0)

我在使用 GrowSurf Javascript Web API 时遇到了同样的问题,渲染函数之后加载的外部脚本,其函数在 componentDidMount() 中未定义。 这是我用来让 GrowSurf 函数不被定义的逻辑。它也可以帮助任何想要使用 index.html 中引入的任何外部 JS 的功能的人。

您可以在 DOMSubtreeModified 中使用 componentDidMount() 来检查每次修改 DOM 时,一旦外部 JS 被加载(找到)在那里运行您的函数,然后停止 {{1} 的循环}.

DOMSubtreeModified

对于您的情况,您可以简单地执行此操作。

componentDidMount() {
    let functionDefined = false;
    window.addEventListener('DOMSubtreeModified', function () {
        if(!functionDefined) {
            if (window.growsurf) {
                console.log('a function is defined', window.growsurf.getReferrerId());
                functionDefined = true;
            }
        }   
    }, false);
}