React - Axios数据在获取数据后不会呈现数据

时间:2017-09-15 10:24:27

标签: javascript reactjs asynchronous render axios

所以我有一个运行Axios请求的React组件,结果设置为我的' ist'状态属性,然后检查渲染。

我的问题是因为它是异步请求,所以第一次渲染检查会进入return <p>Loading...</p>;

我正在寻找一种方法让我的组件呈现加载,直到aync请求完成,然后呈现结果。

这是我的代码:

// defealts
import React from 'react';
import { Helmet } from 'react-helmet';
import axios from 'axios';

class Home extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      pageName: 'Home',
      list: '',
    };
  }

  componentDidMount() {
    this.test();
  }

  test = () => {
    axios.get('https://api.myjson.com/bins/vqqml')
    .then((response) => {
      /* eslint-disable no-console */
      console.log(response);
      /* eslint-enable no-console */
      this.setState({ list: response.data });
    })
    .catch((error) => {
      /* eslint-disable no-console */
      console.log(error);
      /* eslint-enable no-console */
    });
  };

  render() {
    if (this.state.list.data) {
      return (
        <div>
          <p>{this.state.list.data.name}</p>
        </div>
      );
    }
    return <p>Loading...</p>;
  }
}

export default Home;

感谢任何帮助或建议 - 提前谢谢。

3 个答案:

答案 0 :(得分:1)

它不会呈现,因为this.state.list没有data属性,它有nameagecar属性。

您的API调用响应是:

{"name":"John","age":30,"car":null}

而不是

{"data":{"name":"John","age":30,"car":null}}

答案 1 :(得分:0)

您可以在名为state的{​​{1}}中创建另一个属性,如果您收到回复,则将其设置为loadedtrue

然后在this.setState({ list: response.data, loaded: true });

中提问

render

您必须提供if(this.state.loaded) {...}以检查response属性是否在其中。您可能会将data axios与其他类似的东西混淆,比如已经提到的@AndyGaskell

答案 2 :(得分:-1)

您可以尝试使用shouldComponentUpdate()

{"errors"=>[{"domain"=>"global", "reason"=>"backendError", "message"=>"Backend Error"}], "code"=>500, "message"=>"Backend Error"}