【问题标题】:Reactjs: using for-loop inside componentDidMountReactjs:在componentDidMount中使用for循环
【发布时间】:2017-10-03 01:36:06
【问题描述】:

我无法理解为什么我的组件状态在 for 循环内没有改变。

这是一个例子:

class Example extends React.Component {
    constructor() {
        super()
        this.state = { 
            labelCounter: 1, 
        }
    }


    componentDidMount() {                   
        for (let i = 0; i < 10; i++) {
            this.setState({ labelCounter: this.state.labelCounter + 1 })

            console.log(this.state.labelCounter) // this.statelabelCounter = 1
        }
    }

}

如果我将代码稍微更改为这个,它似乎会按预期更改:

class Example extends React.Component {
    constructor() {
        super()
        this.state = { 
            labelCounter: 1, 
        }
    }


    componentDidMount() {                   
        for (let i = 0; i < 10; i++) {
            this.setState({ labelCounter: ++this.state.labelCounter })

            console.log(this.state.labelCounter)
        }
    }

}

【问题讨论】:

    标签: javascript reactjs for-loop


    【解决方案1】:

    我认为您遇到的问题是批量更新状态。这意味着它不是同步工作,而是在循环之后应用setState({ labelCounter: this.state.labelCounter + 1}),并且this.state.labelCounter + 1 被解析为一个固定数字(在本例中为1),即重新应用10 次。所以 labelCounter 设置为 1 10 次。

    在最后一个示例中,您通过自己更改属性来更新(而不是做出反应),这就是它起作用的原因。

    我想最好的方法是等待一个批次被应用(例如使用setTimeout(x, 0)),然后再做剩下的事情,或者尝试完全避免这种情况。

    【讨论】:

    【解决方案2】:

    如果我错了,请纠正我,但“this.state.labelCounter + 1”与“this.state.labelCounter ++”不同,因为它在对状态值进行更改之前评估状态值。

    另一个选项是“this.state.labelCounter += 1”

    来源: (不完全相似) Difference between ++ and +=1 in javascript

    【讨论】:

      猜你喜欢
      • 2019-06-26
      • 2021-11-24
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 2016-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多