javascript - React.js 组件生命周期、状态行为和 JavaScript 的异步特性

标签 javascript ajax reactjs async-await

我对预期结果和实际结果有疑问。即使从 componentWillMount() 调用 fetchData()fetchnumberOfCommits() 方法,数组仍然没有数据。但最后,render 方法被调用两次,其中数组从 API 获取了数据。 我在上述两个方法中调用了 setState() 方法,其中它调用了 render 方法。 我的问题是为什么调用这两个方法后数组没有立即获取数据?数组在什么时候获取数据?

Code example

最佳答案

渲染方法会在组件首次安装时调用,并在收到数据且状态发生更改时再次调用。这就是为什么您会看到渲染方法被调用两次。

componentWillMount() 在 React 16.3 中已弃用。您应该使用 componentDidMount() 来获取数据,并且您应该期望组件在获取数据之前至少渲染一次,因此您需要渲染 null 或获取数据之前的加载状态。我提供了一个示例,说明如何检查它是否已正确加载并显示加载消息。

class App extends React.Component {

  constructor() {
    super();
    this.state = {
      check: true,
      repositories: [],
      commits: [],
    };
  }

  componentDidMount() {
    this.fetchData();
    this.fetchNumberOfCommits();
  }

  fetchData() { /*...*/ }
  fetchNumberOfCommits() { /*...*/ }

  isLoaded() {
    return this.state.respositories.length > 0;
  }

  render() {
    const { repositories } = this.state;

    if(isLoaded) {
      return repositories.map(repo => {
        return (
          <Api
            repo={repo.name}
            createdDay={repo.createdDay} 
          />
        );
      });
    }

    return <h1>Loading repos...</h1>;
  }
}

关于javascript - React.js 组件生命周期、状态行为和 JavaScript 的异步特性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52922038/

相关文章:

javascript - 三.JS,改变子3D对象的世界位置

jquery - 如何通过Ajax将变量从grail的 Controller 传递到gsp文件?

reactjs - React, styled-components - 样式内部 styled-component

javascript - 如何在 React 中实现 Cloudinary Upload Widget?

javascript - 如何在没有突变的情况下按功能创建有效的组?

javascript - 如何在提交时验证此 HTML/JavaScript 表单?

ajax - 同时触发超过 4 个异步 XmlHttpRequest 时 IE8 挂起

javascript - 连接数据库时最好使用 include 或 include_once

css - 如何在 React 服务器端 Rendererd 应用程序上使用样式表?

javascript - Google 标记动画更改