React无法设置状态

时间:2017-06-21 13:23:26

标签: reactjs

我正在使用React并尝试使用API​​中的数据填充ImageGrid。获取数据没有问题,但不知何故我无法使用responseData

设置状态

我可以在从API获得响应时显示数据,但我无法设置状态...

componentWillMount()
{
  this.state = {
    content: ''
  };

   this.loadContent();
}

loadContent()
{
  ApiService.getTweets(topic,numberOfElements,offset).then((responseData) => {
    console.log("Data is here",responseData); //<---------- HERE
    this.setState({
      content: responseData
    });
  })
  console.log("Data is not here",this.state.content); //<---------- HERE
}

我在这里得到数据:

class ApiService {    

  static getTweets() {      

    return fetch("https://MyURL", {
            method: 'get'
          })
          .then((resp) => resp.json())
          .then(function(data) {

            return data;
          }).catch(function(error) {
            console.log(error);// Error :(
          });
    }
  }
export default ApiService;

3 个答案:

答案 0 :(得分:1)

您遇到异步问题:fetchsetState都是异步。

loadContent() {
  ApiService.getTweets(topic,numberOfElements,offset).then((responseData) => {
    console.log("Data is here",responseData); //<---------- HERE
    this.setState({
      content: responseData
    }, () => {
       // only now the state was updated
       console.log("Data is here", this.state.content); 
    });

    // even the nest line runs to early
    console.log("Data is not here",this.state.content); 

  })
  // the next line runs to early
  console.log("Data is not here",this.state.content);
}

答案 1 :(得分:0)

您希望使用设置状态回调,因为状态未立即设置。

loadContent() {
  ApiService.getTweets(topic,numberOfElements,offset).then((responseData) => {
    console.log("Data is here",responseData); //<---------- HERE
    this.setState({
      content: responseData
    }, () => {
      console.log("Data is here",this.state.content); //<---------- HERE
    );
  })
}

答案 2 :(得分:0)

您需要实施componentDidUpdate。不要依赖承诺来了解您的组件何时更新。 React的生命周期会担心系统更新后的 。见下文。

从那时起,您可以轻松地执行类似

的操作
componentDidUpdate(prevProps, prevState) {
  if(prevState.content !== this.state.content) {
    console.log('I have new content!', this.state.content);
  }
}

此外,如果您的组件中只有一个setState()调用,则可以忽略该if语句。所以简短版本如下:

componentDidUpdate(prevProps, prevState) {
  console.log('I have new content!', this.state.content);
}