在不同的 React 模式下,State 的更新流程是不同的。在 React 18 中,可能会采用 concurrent 模式,会采用不同的 State 更新逻辑,这里我们先介绍 legacy 模式下的 State。

# 类中的 State

语法:

setState(obj, callback);

当第一个参数传入的是一个对象的时候,这个对象就是合并的 state ; 如果是一个函数,需要将当前的 state 和 props 作为参数传进去,并返回一个新的 state ;

第二个参数是一个回调函数,可以立即获取最新的 state 。

this.setState({
  count: 1
}, () => {
  console.log(this.state);
})
this.setState(function(state, props) {
  return {
    count: 1
  }
})

state 的更新流程:

触发 setState -> 计算 expirationTime -> 更新调度,调和 fiber 树 -> 合并 state,执行 render -> (commit阶段)替换真实 DOM -> 执行 callback 函数

在实际开发中,频繁的更新 state 对性能很不好,我们可以通过 pureComponent 、shouldComponentUpdate 进行优化。

# setState的基本用法

# setState的更新流程

# setState 原理

# 怎么实现批量更新的

异步环境开启批量更新方法:unstable_batchedUpdates

示例:

提高更新优先级别 flushSync 函数可以将回调函数中的更新任务,放到一个较高的优先级中。

useState的用法