什么情况下使用setState
在我们使用React开发的过程中,大家都知道,当我们要改变state的值,是不可以直接去修改state的值的。就像这样this.state.count = 2,此时语法检测就会提醒我们
所以这个时候我们一般都会使用setState这个方面来改变state中的值。就像这样
this.setState({
count: this.state.count + 1
})
只要我们只用了setState方法更新了state的值之后,就会触发重新渲染。但是在有一些业务场景下,我们需要立即获取state的最新值。上代码
假如说我们在点击“+”的时候,需要将state中的count值加1。然后立即打印count值
在控制台的打印结果中我们可以知道两个信息,1. 获取的count值是旧的
2. 这里的setState是异步的
所以我们如果要获取最新的state值应该怎么解决呢?上代码
方案一:利用setState的第二参数
从上面两张图片可以看到,我们在setState的第二个参数的回调函数中拿到了最新的state的值。但是setState外面还是旧的值,需要我们注意。
方案二:利用setTimeout或者是Promise
首先因为setTimeout是异步任务,所以我们看到setTimeout外部是获取的旧值。但是在setTimeout里面我们可以看到这里的setState是同步的,不然我们也无法打印最新的count值。
总结:setState并不是单纯的同步/异步,而是根据调用场景的不同而不同。
- 异步:在React生命周期时间和合成事件中,setState都是异步的。并且在异步时,如果多次进行setState操作,setState会进行合并的操作
- 同步:在addEventListener、setTimeout、Promise.then中都是同步的。在同步的过程中,react是不会进行setState合并操作的。