setState何时同步,何时异步,为什么?

Posted gooldns

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了setState何时同步,何时异步,为什么?相关的知识,希望对你有一定的参考价值。

setState何时同步,何时异步,为什么

答案:在React库控制时,异步;否则同步。

示例代码如下:

constructor(props){
    super(porps);
    this.state = {
        name:"异步"
    }
}
test(){
    this.setState({
        name:"同步"
    })
    alert(this.state.name)
}
<TouchableOpacity onPress={()=>this.test()}>
    <Text>Button</Text>
</TouchableOpacity> 
上文TouchableOpacity中,是React库控制,此时使用setState则为异步,alert值为"异步"。

如何才能触发同步呢?看如下代码:

test(){
    this.setState({
        name:"同步"
    },function(){
        alert(this.state.name)
    })
}

  此时使用回调的方式,即可触发同步,大部分开发中用到的都是React封装的事件,比如onChange、onClick、onTouchMove等,这些事件处理程序中的setState都是异步处理的。

 

React是怎样控制异步和同步的呢?

在 React 的 setState 函数实现中,会根据一个变量 isBatchingUpdates 判断是直接更新 this.state 还是放到队列中延时更新,而 isBatchingUpdates 默认是 false,表示 setState 会同步更新 this.state;但是,有一个函数 batchedUpdates,该函数会把 isBatchingUpdates 修改为 true,而当 React 在调用事件处理函数之前就会先调用这个 batchedUpdates将isBatchingUpdates修改为true,这样由 React 控制的事件处理过程 setState 不会同步更新 this.state。


 




 

以上是关于setState何时同步,何时异步,为什么?的主要内容,如果未能解决你的问题,请参考以下文章

react面试题面试必备

JavaScript 何时同步?

浅谈ReactVue 部分异步

React拓展 - setState - 路由组件懒加载 - Hooks - Fragment - Context - PureComponent - 插槽 - 错误边界 - 组件通信方式总结(代码片

在验收测试中,我如何知道我的异步事件何时发生?

Protocol Buffer vs Json - 何时选择一个而不是另一个