React.Component setState原子更新

时间:2017-01-03 22:12:43

标签: reactjs atomicity setstate

https://facebook.github.io/react/docs/react-component.html#setstate

  

也可以传递带签名的功能   function(state,props)=> newState。这会将原子更新排入队列   在设置之前咨询状态和道具的先前值   值。例如,假设我们想要增加状态值   通过props.step:

this.setState((prevState, props) => {
  return {myInteger: prevState.myInteger + props.step};
});

这里的原子更新是什么意思? JavaScript不是一种单线程语言吗?这意味着所有更新都必然是原子的?

1 个答案:

答案 0 :(得分:2)

单线程是的,但也有很多潜在的异步性。

let atom = 10
atom = 20
console.log(atom) // guaranteed to be 20, so "atomic"

// race condition
setTimeout(() => atom = 30, Math.random() * 1000)
setTimeout(() => atom = 40, Math.random() * 1000)

setTimeout(() => console.log(atom), 2000) // 30? or 40? random!

setState是异步调用,因此state执行后可能已发生变化。

也许不同的措辞是回调函数将事务性更新排队,但我认为任何花哨的措辞都可能会让人感到困惑。最好只解释状态可能已经改变,因此回调以前状态的确切快照