关于react.js:面试官说说你对react生命周期的理解

38次阅读

共计 1669 个字符,预计需要花费 5 分钟才能阅读完成。

hello,这里是潇晨,明天咱们来看下 react 生命周期在各个阶段是怎么执行的,在面试的过程中有没有遇到这个问题呢,大家也能够学习往期 react 源码体系文章哦,往期文章目录在文章结尾。

在之前的 react 源码介绍中,咱们能够将利用的渲染过程分为 mount 阶段(利用首次渲染)和 update 阶段(利用状态更新),无论在 mount 阶段还是 update 阶段,都会经验两个子阶段,一个是 render 阶段,一个是 commit 阶段。

  • mount时:

    1. render 阶段会依据 jsx 对象构建新的 workInProgressFiber 树,不太理解 Fiber 双缓存的能够查看往期文章 Fiber 架构,而后将相应的 fiber 节点标记为 Placement,示意这个fiber 节点须要被插入到 dom 树中,而后会这些带有副作用的 fiber 节点退出一条叫做 Effect List 的链表中。
    2. commit 阶段会遍历 render 阶段造成的 Effect List,执行链表上相应fiber 节点的副作用,比方 Placement 插入,或者执行 PassiveuseEffect 的副作用)。将这些副作用利用到实在节点上
  • update时:

    1. render 阶段会依据最新状态的 jsx 对象比照 current Fiber,再构建新的workInProgressFiber 树,这个比照的过程就是 diff 算法,diff算法又分成单节点的比照和多节点的比照,不太分明的同学参见之前的文章 diff 算法,比照的过程中同样会经验收集副作用的过程,也就是将比照进去的差别标记进去,退出 Effect List 中,这些比照进去的副作用例如:Placement(插入)、Update(更新)、Deletion(删除)等。
    2. commit 阶段同样会遍历 Effect List,将这些fiber 节点上的副作用利用到实在节点上

为什么要先讲 rendermountupdate 阶段的整体流程呢,这是因为 react 生命周期就是穿插在这些子阶段中执行的,来看一张图

  • render阶段:

    1. mount时:组件首先会经验constructorgetDerivedStateFromPropscomponnetWillMountrender
    2. update时:组件首先会经验componentWillReceivePropsgetDerivedStateFromPropsshouldComponentUpdaterender
    3. error时:会调用getDerivedStateFromError
  • commit阶段

    1. mount时:组件会经验componnetDidMount
    2. update时:组件会调用getSnapshotBeforeUpdatecomponnetDidUpdate
    3. unMount时:调用componnetWillUnmount
    4. error时:调用componnetDidCatch

其中红色的局部不倡议应用,须要留神的是 commit 阶段生命周期在 mutation 各个子阶段的执行程序,能够温习上一章

接下来依据一个例子来解说在 mount 时和 update 时更新的具体程序:

  • mount时:首先会依照深度优先的形式,顺次构建 wip Fiber 节点而后切换成 current Fiber,在render 阶段会顺次执行各个节点的 constructorgetDerivedStateFromProps/componnetWillMountrender,在commit 阶段,也就是深度优先遍历向上冒泡的时候顺次执行节点的componnetDidMount

相干参考视频解说:进入学习

  • update时:同样会深度优先构建 wip Fiber 树,在构建的过程中会 diff 子节点,在 render 阶段,如果返现有节点的变动,例如上图的 c2,那就标记这个节点 Update Flag,而后执行getDerivedStateFromPropsrender,在 commit 阶段会顺次执行节点的getSnapshotBeforeUpdatecomponnetDidUpdate
正文完
 0