【发布时间】:2018-06-29 14:32:09
【问题描述】:
我有以下代码 -
class Sum extends React.Component {
constructor(props) {
super(props)
this.state = { a : 0 }
}
// let's call this ADD-1
add = () => {
this.setState({ a: this.state.a + 1 })
this.setState({ a: this.state.a + 2 })
this.setState({ a: this.state.a + 3 })
}
render() {
return (<div>
<button onClick={this.add}> click me </button>
<div> sum {this.state.a} </div>
</div>)
}
}
这会在点击按钮时呈现
sum = 3
我希望它会在哪里呈现 sum = 6 即 1 + 2 + 3
另外,如果我将我的 add 方法更改为适应 prevState 竞争条件的方法 -
// let's call this ADD-2
add = () => {
this.setState({ a: this.state.a + 1 })
this.setState({ a: this.state.a + 2 })
this.setState(prevState => ({ a: prevState.a + 1 }))
this.setState(prevState => ({ a: prevState.a + 4 }))
}
它呈现sum = 7,而我希望得到sum = 8,即(1 + 2 + 1 + 4)
现在我想到了两个问题:-
1) 为什么我们看到的结果是上面提到的,而不是我所期望的?
2) 为什么我在 UI 中看不到添加的过渡?
假设我们考虑标记为ADD-1 的方法,我应该看到类似sum = 1 然后sum = 3 然后sum = 6。是因为批处理更新,但批处理将它们置于执行队列中,我认为它不会覆盖任何内容。
【问题讨论】:
-
setState 是异步的,所有这些都被一次“基本上”调用。这意味着最后一个是将状态设置为 0 + 3。 setState 方法有一个回调,如果你想等待它更新然后调用你的另一个 setState。 this.setState({value: value+1}, () => { this.setState({value: value + 2})}) medium.com/@wereHamster/…
标签: javascript reactjs setstate