Siv*_*s N 3 javascript calendar google-calendar-api google-api-js-client reactjs
我正在尝试在 react js 应用程序中实现谷歌日历 api 的这个vanilla js 示例。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')
);
Run Code Online (Sandbox Code Playgroud)
截至目前,我收到此错误:
未捕获的类型错误:无法读取 null 的属性“isSignedIn”
请指导我走得更远......
最后添加我的解决方案,以帮助未来的人:)
要获取事件列表,不需要授权。所以从谷歌的快速入门示例中删除了不必要的代码。
componentDidMount = () => {
this.getEvents();
}
getEvents(){
let that = this;
function start() {
gapi.client.init({
'apiKey': GOOGLE_API_KEY
}).then(function() {
return gapi.client.request({
'path': `https://www.googleapis.com/calendar/v3/calendars/${CALENDAR_ID}/events`,
})
}).then( (response) => {
let events = response.result.items
that.setState({
events
}, ()=>{
console.log(that.state.events);
})
}, function(reason) {
console.log(reason);
});
}
gapi.load('client', start)
}
Run Code Online (Sandbox Code Playgroud)
您可以在此处找到完整的代码和功能演示。