React组件生命周期API请求

时间:2016-08-13 11:45:16

标签: javascript reactjs foursquare

我正在尝试向FourSquare API发出请求,希望以YYYYMMDD的格式发送时间对象。我编写了一个生成时间对象的函数,但是在我的React应用程序中使用它时遇到了问题。

我在try{ db.delete()} catch{...} 组件中拨打电话:

Profile

当我在Chrome中加载应用时,我收到错误消息:'use strict' import React, { Component } from 'react' import request from 'superagent' import TimeService from './services/time' import config from './config' class Profile extends Component { componentDidMount() { TimeService.getCurrentTime((err, currentDate) => { this.setState({ time: currentDate }) }) } componentWillMount() { let currentTime = this.state.time let venue = '4dd64e9de4cd37c8938e7b83' //let venue = this.props.venueId let clientId = config.CLIENT_ID let clientSecret = config.CLIENT_SECRET request.get(`https://api.foursquare.com/v2/venues/${venue}/hours/?\&client_id=${clientId}&client_secret=${clientSecret}&v=${currentTime}`) .accept('json') .end((err, res) => { if(err) return let result = res.body console.log(res.body) console.log(result.response.hours.timeframes) }) }

我的猜测是我需要在组件安装方法中重新排序功能,但我不确定如何。

1 个答案:

答案 0 :(得分:2)

在组件的生命周期中的特定点执行各种方法。

  • componentWillMount在初始渲染发生前执行一次。

  • componentDidMount在初始渲染后执行一次。

您在componentDidMount中装入组件时设置状态,但在componentWillMount之前使用它。

所以当你使用时:

let currentTime = this.state.time

未定义尚未,因此您获得了Cannot read property 'time' of null

您应该在componentWillMount中设置您的状态,render()会看到更新后的状态,并且只会在状态发生变化时执行一次。

之后,一旦安装了组件,就可以执行对Foursquare API的调用,将定义状态中的time属性,以便它不会再触发错误。

您可以在the documentation中获得有关组件生命周期的更多信息。

本文档还指出发送AJAX请求的首选方法是componentDidMount

  

如果要与其他JavaScript框架集成,使用setTimeout或setInterval设置计时器,或发送AJAX请求,请在此方法中执行这些操作。