React 16 源码学习总结

967 阅读2分钟
  1. 请简述 React 16 版本中初始渲染的流程 初始渲染分为render 和 commit 两个阶段,主要流程:

    • 构建FiberRoot 和 rootFiber两个对象, 并建立引用关系
    • 计算过期时间,确定任务的优先级,创建待执行的任务
    • 判断任务是否是同步任务,调用同步任务入口
    • 构建 workInProgress Fiber 树
    • 完成render阶段,进入提交阶段
    • 提交第一阶段 ,调用类组件的 getSnapshotBeforeUpdate 生命周期函数
    • 提交第二阶段, 根据 effectTag 执行 DOM 操作
    • 提交第三阶段, 调用类组件的生命周期函数componentDidMount 或 调用函数组件的useEffect钩子函数
  2. 为什么 React 16 版本中 render 阶段放弃了使用递归 使用循环递归比对virtualDOM时, 如果virtualDOM 对象的层级比较深的情况下,会由于JavaScript是单线程的执行任务,且无法中断,这样会导致用户的操作无法及时响应,动画无法加载等,页面出现卡顿现象。因此, React 16 放弃了循环递归的方式,采用了循环模拟递归的方式,利用了浏览器的空闲时间去做比对,从而解决了页面卡顿的问题

  3. 请简述 React 16 版本中 commit 阶段的三个子阶段分别做了什么事情

    第一阶段 :调用类组件的 getSnapshotBeforeUpdate 生命周期函数

    第二阶段: 根据 effectTag 执行 DOM 操作

    第三阶段:调用类组件的生命周期函数componentDidMount 或 调用函数组件的useEffect钩子函数

  4. 请简述 workInProgress Fiber 树存在的意义是什么 当进行更新时, workInProgress Fiber 树 在内存中构建,构建完成后会用于替换当前的current Fiber,达到快速更新DOM,快速完成页面的更新