关于React中setState异步还是同步的问题

540 阅读2分钟

什么情况下使用setState

在我们使用React开发的过程中,大家都知道,当我们要改变state的值,是不可以直接去修改state的值的。就像这样this.state.count = 2,此时语法检测就会提醒我们

image.png

所以这个时候我们一般都会使用setState这个方面来改变state中的值。就像这样

    this.setState({
        count: this.state.count + 1
    })

只要我们只用了setState方法更新了state的值之后,就会触发重新渲染。但是在有一些业务场景下,我们需要立即获取state的最新值。上代码

image.png

image.png 假如说我们在点击“+”的时候,需要将state中的count值加1。然后立即打印count值

image.png 在控制台的打印结果中我们可以知道两个信息,1. 获取的count值是旧的 2. 这里的setState是异步的 所以我们如果要获取最新的state值应该怎么解决呢?上代码 方案一:利用setState的第二参数

image.png

image.png 从上面两张图片可以看到,我们在setState的第二个参数的回调函数中拿到了最新的state的值。但是setState外面还是旧的值,需要我们注意。 方案二:利用setTimeout或者是Promise

image.png

image.png 首先因为setTimeout是异步任务,所以我们看到setTimeout外部是获取的旧值。但是在setTimeout里面我们可以看到这里的setState是同步的,不然我们也无法打印最新的count值。 总结:setState并不是单纯的同步/异步,而是根据调用场景的不同而不同。

  • 异步:在React生命周期时间和合成事件中,setState都是异步的。并且在异步时,如果多次进行setState操作,setState会进行合并的操作
  • 同步:在addEventListener、setTimeout、Promise.then中都是同步的。在同步的过程中,react是不会进行setState合并操作的。