Skip to content

React 的 batchUpdate 和 transaction 机制

setState 和 batchUpdate

  • 有时异步(普通使用),有时同步(setTimeout、DOM 事件)
  • 有时合并(对象形式),有时不合并(函数形式)
  • 后者比较好理解(像 Object.assign),主要讲解前者

核心要点

  • setState 主流程
  • batchUpdate 机制
  • transaction 事物机制

setState 主流程

react

左边分支 - 异步流程(isBatchingUpdates=true)

js
// 开始:处于 batchUpdate
// isBatchingUpdates = true
this.setState({
  count: this.state.count + 1,
});
console.log('count', this.state.count); // 异步的,拿不到最新值
// 结束
// isBatchingUpdates = false

右边分支 - 同步流程(isBatchingUpdates=false)

js
// setTimeout 中 setState 是同步的
// 开始:处于 batchUpdate
// isBatchingUpdates = true
setTimeout(() => {
  // 此时 isBatchingUpdates 是 false
  this.setState({
    count: this.state.count + 1,
  });
  console.log('count in setTimeout', this.state.count);
});
// 结束
// isBatchingUpdates = false

setState 异步还是同步?

  • setState 无所谓异步还是同步
  • 看是否能命中 batchUpdate 机制
  • 判断 isBatchingUpdates 条件

batchUpdate 机制

哪些能命中 batchUpdate 机制

  • 生命周期(和它调用的函数)
  • React 中注册的事件(和它调用的函数)
  • React 可以“管理”的入口

哪些不能命中 batchUpdate 机制

  • setTimeout setInterval 等(和它调用的函数)
  • 自定义的 DOM 事件(和它调用的函数)
  • React “管不到”的入口

transaction 事物机制

执行过程

js
increase = () => {
  // 开始:处于 batchUpdate
  // isBatchingUpdates = true
  // 其他操作
  // 结束
  // isBatchingUpdates = false
};

流程图

react

比如

js
transaction.initialize() = function (){
  console.log('initialize')
}
transaction.close() = function (){
  console.log('close')
}
function method(){
  console.log('abc')
}

transaction.perform(method)

// initialize
// abc
// close

基于 MIT 许可发布