【问题标题】:ReactJS - waiting for multiple setState to complete before executing next codeReactJS - 在执行下一个代码之前等待多个 setState 完成
【发布时间】:2020-09-28 19:21:31
【问题描述】:

我正在使用 ReactJS,但遇到了问题。从 axios 获取我的 response.data 后,我多次使用 setState 将所有必要的数据设置到我的状态中。但是,问题是我想等待所有 setStates 完成,然后再继续下一行代码。我不知道该怎么做,因为我知道 setState 接受第二个回调函数,但这仅适用于单个 setState。我尝试研究 Promise,但我不确定如何正确实施。

这是我的代码:

axiosInstance.get(`/customer-converted/?group=department&metric=${metric}&start=${start}&end=${end}`)
    .then(response => {
        this.setState({ data: response.data });
        let rangeStart = (response.data.length > 3) ? response.data[response.data.length - 3].date : response.data[0].date
        let rangeEnd = response.data[response.data.length - 1].date
        this.setState({ start: rangeStart })
        this.setState({ end: rangeEnd })
        // execute next line of code here only after all setState above are finished
    })

感谢所有帮助,谢谢!

【问题讨论】:

  • 当setState实际更新状态时,你需要执行另一行,这就是你需要的?
  • 是的,这就是我需要的
  • 希望你能得到答案。

标签: javascript reactjs


【解决方案1】:

你可以像这样同时设置多个东西:

this.setState({ start: rangeStart, end: rangeEnd })

你也可以在setState 中使用回调来做一些事情状态被设置之后

this.setState({
    start: rangeStart, 
},() => {
    console.log('you can do something else here after you set state');
});

【讨论】:

  • 我去试试,谢谢!我不知道我可以一次更新多个状态键
  • 不用担心。你能接受我明天的回答吗,因为我今天收到了声誉限制:/谢谢@jason :)
  • 没问题!我会记得明天接受它:-) 但我的时区是 gmt +0800 那么它会影响你的明天和我的明天是否不同吗?
  • 哈哈我不确定。我明天会ping你确定。谢谢!祝你有美好的一天:)
  • @jason 嘿伙计,从现在开始随时将其标记为正确。谢谢:)
【解决方案2】:

setState 方法接受第二个参数,这是一个回调,将在状态更新后执行。

axiosInstance.get(`/customer-converted/?group=department&metric=${metric}&start=${start}&end=${end}`)
    .then(response => {

        let rangeStart = (response.data.length > 3) ? response.data[response.data.length - 3].date : response.data[0].date
        let rangeEnd = response.data[response.data.length - 1].date
         // also you should combine state updates together
         this.setState({ data: response.data, start: rangeStart, end: rangeEnd  }, () => console.log('state was updated'));

        // execute next line of code here only after all setState above are finished
    })

【讨论】:

  • 哦,我可以在一次 setState 调用中更新状态内的多个数据键吗?好的,我去试试,谢谢!
【解决方案3】:

试试这个可能对你有帮助

axiosInstance.get(`/customer-converted/?group=department&metric=${metric}&start=${start}&end=${end}`)
    .then(response => {
        this.setState({ data: response.data });
        let rangeStart = (response.data.length > 3) ? response.data[response.data.length - 3].date : response.data[0].date
        let rangeEnd = response.data[response.data.length - 1].date
        this.setState({ start: rangeStart })
        this.setState({ end: rangeEnd })
        return response
    }).then((response)=>{
// execute next line of code here 
});

【讨论】:

    【解决方案4】:

    出于此处所述的原因 - What is the advantage of using componentDidUpdate over the setState callback?

    使用更现代的 React 版本并使用钩子,您可以使用 useEffect 对状态更新做出反应,从而实现更具“反应性”的编程样式。

    【讨论】:

    • 你的意思是使用reactHooks的useEffect来检测特定状态对象的变化,以便之后执行必要的代码?在那种情况下,有没有办法让它只运行一次?就像上面那些状态对象第一次更新一样,但是之后,我不想再通过那个 useEffect 运行了,有没有办法这样做?
    • 每次更新依赖项时都不会发生任何影响。在第一次更新状态而不是后续更改状态后,您需要做什么?
    猜你喜欢
    • 1970-01-01
    • 2021-07-30
    • 2020-04-29
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多