React源码解析11-commitWrok

448 阅读2分钟

1.invokeGuardedCallbackDev

这个函数主要是让我们执行函数捕获错误 但是和try,catch不同的地方如下

1.try,catch当我们勾选啦停止在捕获报错的地方就会停止

image-20210508175903872

2.这个函数让我们浏览器devtool不用停止在报错的地方(因为浏览器可以勾选上停止在报错的地方这个选项),好方便我们看到完整的组件页面 因为我们组件内的报错都被captureDiderror处理啦 所以是可以重现渲染出新组件的 我们不需要停下来

window.addEventListener('error',(event)=>{
    console.log('event',event);
  })

可以监听到js文件代码(source中)具体哪一行报错

2.commitBeforeMutationLifeCycles

作用:给effect-list链上每个instance执行instance的getSnapshotBeforeUpdate生命周期返回对象为snapshot,加入到instance的属性上 方便后面的commitlifecycyle调用 且在componentidiupdate生命周期里面拿到这个snapshot进行前后对比判断是否更新

3.commitPlaceMent

1.找到最近是原生类型的节点(hostComponent,hostPortal,hostText)的元素作为父节点

2.找到该元素的兄弟dom节点,因为可能同一层是fiber节点 fiber节点的子节点是dom节点 这个时候这个节点也算该元素的兄弟dom节点 如果自己是classcmp则自己的孩子继续作为Node

注意只有该节点插入 该节点的子节点的在后面的effect-list链中effect 如果这个节点不是dom 则第一层子节点插入 也不能再深入子节点

3.如果有兄弟dom节点 则插入到兄弟dom节点前面 没有兄弟节点 则直接父元素appendchild

4.commitWork

根据updatePayloadQueue更新props(特殊属性特殊处理)和text

5.commitDeletion

1.深度优先遍历子树 删除所有子树上的节点 执行classCmp的unmount生命周期 删除ref

2.流程

(1)深度优先遍历所有的子节点 如果是HostComponent和HostText会一直深度优先遍历该节点 所有的HostComponent和HostText都会执行从dom树删除。

(2)如果碰到HostPortal 会改变parent为当前container 然后让子元素作为node继续(1)的深度递归

(3)如果是classCmp 则执行生命周期componentWillUnmount和删除ref 子节点当作node继续遍历

6.commitAllLifeCycles

1.执行类组件的生命周期 同时执行updateQueue中所有的effect(即callback)

2.普通dom元素如果有focus执行focus