【发布时间】:2017-12-28 14:35:06
【问题描述】:
我正在尝试在 react js 应用程序中实现 this vanilla js 示例的 google 日历 api。 vanilla JS 示例在我的本地机器上运行良好。但是在反应中实施同样的事情时遇到了很多麻烦。请检查下面的代码:
class App extends React.Component{
constructor(props) {
super(props);
var CLIENT_ID = '992549188018-3prg54pp18je3e3qhgcttgl11491c4dm.apps.googleusercontent.com';
var DISCOVERY_DOCS = ["https://www.googleapis.com/discovery/v1/apis/calendar/v3/rest"];
var SCOPES = "https://www.googleapis.com/auth/calendar";
this.state = {
showAuthButton: false,
showSignOutButton: false
};
this.initClient = this.initClient.bind(this);
this.updateSigninStatus = this.updateSigninStatus.bind(this);
}
handleAuthClick(){
gapi.auth2.getAuthInstance().signIn();
}
handleSignoutClick(){
gapi.auth2.getAuthInstance().signOut();
}
handleClientLoad() {
gapi.load('client:auth2', this.initClient);
}
initClient(DISCOVERY_DOCS, CLIENT_ID, SCOPES) {
gapi.client.init({
discoveryDocs: DISCOVERY_DOCS,
clientId: CLIENT_ID,
scope: SCOPES
}).then(function () {
console.log(window.gapi);
// Listen for sign-in state changes.
window.gapi.auth2.getAuthInstance().isSignedIn.listen(updateSigninStatus);
// Handle the initial sign-in state.
updateSigninStatus(gapi.auth2.getAuthInstance().isSignedIn.get());
authorizeButton.onclick = handleAuthClick;
signoutButton.onclick = handleSignoutClick;
});
}
updateSigninStatus(isSignedIn) {
if (isSignedIn) {
this.setState({
showAuthButton: false,
showSignOutButton: true
})
//listUpcomingEvents();
//insertNewEvent();
} else {
this.setState({
showAuthButton: true,
showSignOutButton: false
})
}
}
componentDidMount(){
this.handleClientLoad();
}
render(){
let authButton = <button id="authorize-button" onClick={this.handleAuthClick.bind(this)}>Authorize</button>
let signOutButton = <button id="signout-button" onClick={this.handleSignoutClick.bind(this)}>Sign Out</button>
return(
<div className="container">
{this.state.showAuthButton ? authButton : null}
{this.state.showSignOutButton ? signOutButton : null}
</div>
)
}
}
ReactDOM.render(
<App />,
document.getElementById('root')
);
目前收到此错误:
未捕获的类型错误:无法读取 null 的属性“isSignedIn”
请指导我进一步前进...
【问题讨论】:
-
您将
CLIENT_ID等定义为构造函数中的变量,但试图以this.CLIENT_ID的形式访问它 -
@marzelin 我已经更新了代码,仍然出现同样的错误!
-
要么将配置变量移到组件外,以便可以通过
initClient方法访问,要么将配置数据分配给this对象并以这种方式访问它。 -
仍然出现同样的错误
-
如果无法访问整个应用程序,很难知道发生了什么。您能否将您的代码上传到 github,以便我可以克隆它并重现错误?
标签: javascript reactjs calendar google-api-js-client google-calendar-api