【问题标题】:JavaScript while loop not behaving due to setState not updating correctly由于 setState 未正确更新,JavaScript while 循环无法正常运行
【发布时间】:2017-01-04 14:34:19
【问题描述】:
dealerTwisted = () => {
    console.log(this.state.dealersOverallTotal, 'total on entry');
    let looping = true;
    while(looping){
      console.log(this.state.dealersOverallTotal,'same');
      if(this.state.dealersOverallTotal < 17){
        this.deal2Dealer();
        let dealersDeck = this.state.dealersDeck;
        let newDealersDeckTotal = [];
        for (var i=0; i < dealersDeck.length; i++){
          newDealersDeckTotal.push(dealersDeck[i].rankValue)
        }
        let total = newDealersDeckTotal.reduce(function(a, b) {
          return a + b;
        },
        0);
        console.log(total, 'tot');
        this.setState({ dealersOverallTotal: total }, () => console.log(this.state.dealersOverallTotal));
      }

总 console.log 正在做正确的事情,而回调函数没有将 DealersOverallTotal 更新为新的 total 值。 例如 总计将记录:每个循环 4、15、19 等 this.state.dealersOverallTotal 将在每个循环中记录:12、12、12 等 它应该与总计同步,因为我已将其状态设置为与总计相同

谁能看到它为什么不更新? (我尝试将它放在回调中无济于事)

【问题讨论】:

    标签: javascript reactjs while-loop


    【解决方案1】:

    Facebook 团队为 React 写了一个很好的 documentation ;)

    setState() 不会立即改变 this.state 而是创建一个挂起的状态转换。在调用此方法后访问 this.state 可能会返回现有值。 无法保证 setState 调用的同步操作,并且可能会批量调用以提高性能。

    我真的不知道你为什么要这样做,但这不是这样做的好方法。

    【讨论】:

      【解决方案2】:

      setState() 不会立即改变 this.state 而是创建一个挂起的状态转换。调用此方法后访问 this.state 可能会返回现有值。

      但是一旦控制进入 render() 函数,状态就会更新:

      var storeState;
          inXYZ()
          {
            this.setState({ dealersOverallTotal: total })
            //no state update
            console.log('state is updated',this.state.dealersOverallTotal)
          }
      
          render()
          {
           //updated over here
            storeState=this.state.dealersOverallTotal;
           console.log('state is updated',this.state.dealersOverallTotal)
          }
      

      【讨论】:

      • 但我需要它在我的循环中改变,因为我需要它在循环中继续,直到它到达 else 块
      • 一旦 setState 被触发,控制就会去渲染,在那里你可以设置一个全局变量并在任何地方使用它,请查看更新的答案。
      • 我认为不使用 setState 方法设置状态很危险,不是吗?
      • 我没有得到你的兄弟。
      • 您更新了 render() 中的状态,如下所示:` storeState=this.state.dealersOverallTotal;` 这与 this.setState({dealersOverallTotal: something}) 不同
      猜你喜欢
      • 2021-03-06
      • 2023-03-28
      • 2013-06-17
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多