react相关整理
pureComponent
【react相关整理】是 ReactComponent.prototype = isPureComponent = true
为了在后面渲染的时候 checkShouldUpdate的时候 如果是isPureComponent 会进行shallowequall对oldProps,newProps 以及 newState oldState 两个都进行比较,如果不平等重新更新,进行的是前浅比较(object的话会判断keys 的length 以及keys)
hooks 要确保每一次渲染都中都按照同样的顺序被调用,不要再循环、嵌套以及条件中调用hooks
useState
初始化的时候回让memorizedState 等于 initialState
useState返回的是[memorizedState,dispatch]
useState 是按照执行顺序执行的,其内部是以单向链表的形式
Hook {
memorizedState: any, //指向当前渲染节点的fiber,上一次完整更新之后的最终状态值
baseState: any,// 初始化的initialState,以及每次dispatch之后的newState
baseUpdate,// 当前需要更新的update,每一更新完会赋值上一个update
queue: updateQueue | null // 缓存更新队列,存储多次更新昕蔚
next: HOOk || null 指向下一个需要执行的hook,通过next串联每一个hook
}
对于首次加载还是更新
useState = 当前fiber是否为空 , ReactCurrentDispatcher.current.useState 将要赋值成HooksDispatcherOnMount.useState,否则就是HooksDispatcherOnUpdate.useState.
useState = ReactCurrentDispatcher.current.useState = HooksDispatcherOnMount.useState = mountState;更新时 useState = ReactCurrentDispatcher.current.useState = HooksDispatcherOnUpdate.useState = updateState。
基于上从而初始化的时候调用的是mountState, 此时会创建一个新的hook,并返回当前的workInProgressHook, 初始化赋值memorizedState = baseState = initialState
创建dispatch绑定子当前fiber和队列。
useEffect
mountEffect
hook.memorizedState = pushEffect(hookEffectTag, create(useEffect穿进去的函数), undefined,deps(触发依赖的数组)) => return mountEffectImpl(hooksEff)
updateEffect
类同mountEffect,只是第三项会存在一个destroy,并且会areHookInputsEqual(nextDeps,prevDeps) 是否响应执行,如果是的则pushEffect(NoHookEffect,create,destroy,nextDeps)
pushEffect
针对mountEffect和updateEffect都执行了pushEffect做了条件判断,这里面是一个循环链表,这里面判断componentUpdateQueue是否为空,空从而是执行的mountEffect,此时责创建一个componentUpdateQueue,里面是{lastEffect: null};并且lastEffect指向effect.next,就是下一个effect
Fiber核心
Fiber的核心是从ReactDOM.render
render的核心是掉哟就那个updateContainer ==》 来源于react-reconciler =》 ReactFiberReconciler.JS
updateContainer ==》 执行返回 return updateContainerAtExpirationTime
updateContainerAtExpirationTime ===》 return scheduleRootUpdate
scheduleRootUpdate ==> 内部执行 enqueueUpdate & scheduleWork return expirationTime
重点在于sheduleWork(相当于Fiber入口)此时内部有 renderRoot
renderRoot里面关注两点
- workLoop 是代码的核心部分,配合循环是是实现任务循环
- 在超时的情况,会进入commit阶段
在workLoop中 performUnitOfWork
推荐阅读
- 20190302|20190302 复盘翻盘
- 【韩语学习】(韩语随堂笔记整理)
- 三国谋略22(找准你的定位)
- react|react 安装
- 思维导图作业3—工作相关导图
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- React.js学习笔记(17)|React.js学习笔记(17) Mobx
- AnyProxy抓取http/https请求
- day16-Linux|day16-Linux 软件管理
- iOS|iOS runtime应用整理