我正在尝试向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)
})
}
我的猜测是我需要在组件安装方法中重新排序功能,但我不确定如何。
答案 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请求,请在此方法中执行这些操作。