• 有时异步,有时同步(setTimeout、DOM事件)
  • 有时合并(对象形式),有时不合并(函数形式)

setState主流程

setState 和 batchUpdate - 图1

  1. class DemoLeft extends React.Component {
  2. constructor() {...}
  3. render() {...}
  4. increase = () => {
  5. // 开始:处于 batchUpdate
  6. // isBatchingUpdates = true;
  7. this.setState({
  8. count: this.state.count + 1
  9. });
  10. // isBatchingUpdates = false;
  11. }
  12. }
  1. increase = () => {
  2. // 开始:处于 batchUpdate
  3. // isBatchUpdates = true
  4. setTimeout(() => {
  5. // 此时 isBatchingUpdates 是false
  6. this.setState({
  7. count: this.state.count + 1
  8. })
  9. })
  10. // 结束
  11. // isBatchUpdates = false;
  12. }
  1. componentDidMount() {
  2. // 开始:处于 batchUpdate
  3. // isBatchingUpdates = true
  4. document.body.addEventListener('click', () => {
  5. // 此时 isBatchingUpdates 是 false
  6. this.setState({
  7. count: this.state.count + 1
  8. })
  9. console.log(this.state.count);
  10. })
  11. // 结束
  12. // isBatchUpdates = false;
  13. }

setState 异步还是同步?

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

    哪些能命中 batchUpdate 机制

  • 生命周期(和它调用的函数)

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

    哪些不能命中 batchUpdate 机制

  • setTimeout setInterval 等(和它调用的函数)

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