我正在尝试将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))
}
}...
答案 0 :(得分:4)
我认为你是对的。我处理这些情况的方法是从React加载外部JS文件并在promise中使用它。
所以你的流程应该是这样的:
创建辅助函数。将它放在像helpers/load-script
这样的文件夹中。您可以在下面找到该文件中应包含的所有代码:
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;
接下来,将要使用它的组件内的该函数导入:
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;
答案 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);
}