37.调用setState之后发生了什么?

setState是一个类组件中用来更新组件状态的一个方法,当我们调用setState时,React会执行如下的步骤:

1. 批量更新

React会将多个setState调用合并为一次更新,以提高性能,这就意味着在事件处理函数中连续调用setState可能不会立即更新状态,而是被合并后一次性处理

2. 异步更新

setState的更新是异步的,React会将状态更新进行一个排队,然后异步地将他们应用到组件的状态上

3. 触发重新渲染

一旦状态被更新了,React会将组件的props和新的state作为参数传递给render函数,触发组件的重新渲染

4. 浅合并状态

如果传递一个对象给setState,React会将这个对象与组件的状态进行合并,这意味着只有对象中明确指定的属性才会被更新,其他字段会保持不变

5. 调用生命周期

在组件重新渲染之前,React会调用shouldComponentUpdate生命周期方法,如果shouldComponentUpdate返回了false,则不会进行更新和渲染

6. 更新DOM

重新渲染完成之后,React会使用虚拟DOM来比较组件的当前状态和之前的状态,计算出实际需要变更的地方,然后更新DOM

7. 调用生命周期方法

在DOM更新之后,会调用componentDidUpdate生命周期方法

8. 错误处理

如果在渲染过程中发生了错误,React会捕获错误并停止渲染和状态更新,同时会显示错误边界中的错误信息

9. 传递上下文

如果组件使用了上下文, setState也会导致使用相同上下文的组件重新渲染,即使他们没有直接出发状态更新