当前位置: 首页 > Web前端 > CSS

React源码Part7——Commit(变异阶段)

时间:2023-03-31 01:08:13 CSS

React源码Part-1——代数效应:https://segmentfault.com/a/11...React源码Part2——渲染原理:https://segmentfault.com/a/11...React源码Part3-Fiber架构:https://segmentfault.com/a/11...React源码Part4-Render渲染(Mount阶段):https://segmentfault.com/a/11...React源码Part4——Render渲染(更新阶段):https://segmentfault.com/a/11...React源码Part5——commit阶段(处理类组件生命周期)cycle):https://segmentfault.com/a/11...React源码Part6——Commit阶段(beforeMutation):https://segmentfault.com/a/11...React源码Part8——Commit(Layoutphase):https://segmentfault.com/a/11...参考链接:React技术秘籍-https://react.iamkasong.com/p...Mutation阶段主要是什么1.入口函数:commitMutationEffects()2。准备开始执行:commitMutationEffects_begin3。遍历Effect列表:commitMutationEffects_complete4。处理获取的单个Fiber节点:commitMutationEffectsOnFiber5。对于Class组件,这个阶段会执行componentWillUnMount生命周期;对于函数组件Hook,它会执行从useEffect返回的值,用于清理某些副作用。对于后面的useEffect,handleStatusChange函数会在Layout阶段执行;useEffect返回的函数将在Mutation阶段执行以清除副作用friend.id,handleStatusChange);};});commitMutationEffectsMutation阶段入口函数导出函数commitMutationEffects(root:FiberRoot,firstChild:Fiber,committedLanes:Lanes,){inProgressLanes=;承诺根;nextEffect=firstChild;commitMutationEffects_begin(根);inProgressLanes=null;inProgressRoot=null;}commitMutationEffects_begin——开始进入Mutation阶段遍历Effect列表,如果Fiber节点上有child需要删除,则删除commitDeletion(root,childToDelete,fiber)传递单个Fiber节点commitMutationEffects_complete处理函数commitMutationEffects_begin(root:FiberRoot){while(nextEffect!==null){constfiber=nextEffect;//TODO:应该将其包装在标志检查中,作为优化constdeletions=fiber.deletions;if(deletions!==null){for(leti=0;i