javascript - React componentDidMount() 初始化状态

标签 javascript arrays reactjs setstate

在 React 中开发一个小项目,我使用 Axios 从经过测试的 API 中获取信息。问题是,当我提取数据并尝试更新组件状态时,来自 API 的值不会填充到要在组件中呈现的状态中。

我一直在尝试获取这样的状态数据:

  componentDidMount() {
    this.state.databases.forEach(d => {
      axios.get(`http://localhost:3204/customer/${d}/count`).then(value => {
        this.setState({ counts: this.state.counts.push(value.data) });
      });
    });
    console.log(this.state);
  }

以前的版本是这样写的:

componentDidMount() {
    let internalCounts = [];
    this.state.databases.forEach(d => {
        axios.get(`http://localhost:3204/customer/${d}/count`).then(value => {
            internalCounts.push(value.data);
        });
    });
    this.setState({count: internalCounts});
}

这两种情况都会得到相同的结果。新的计数数组永远不会真正更新状态。我怀疑这是由于 Axios setState 的异步性质造成的。

有什么简单有效的方法可以让这两个人停止互相竞争?

最佳答案

在第一个版本中,您是正确的,这是由于服务的异步性质造成的。您正在记录输出,但这是在服务解决之前发生的。

在第二个(前一个)示例中,您在解析之前设置状态。我建议采用以下方法,创建一个 promise 数组,然后等待所有 promise 解决后再更新状态:

componentDidMount() {
    const promises = [];
    this.state.databases.forEach(d => {
        promises.push(axios.get(`http://localhost:3204/customer/${d}/count`));
    });
    Promise.all(promises).then(results => {
        const internalCounts = [];
        results.map(result => {
            internalCounts.push(result.data);
        });
        this.setState({count: internalCounts});
    })
}

关于javascript - React componentDidMount() 初始化状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51561289/

相关文章:

javascript - React 中的受控选择未设置 defaultValue

javascript - 如何更新 React 组件的数组?

python - 索引错误 : shape mismatch: indexing arrays could not be broadcast together with shapes

javascript - 导航和购物车菜单问题不展开不折叠

javascript - Bower 安装库问题

javascript - 如何处理两个日期之间验证的错误?

javascript - 有没有办法在一行中编写 javascript 对象数组?

node.js - webpack 警告 - DefinePlugin 中的警告 'process.env.NODE_ENV' 的冲突值

javascript - 从数组值映射的 react 按钮未定义

javascript - React JS - 路由 - 元素类型无效