


























this.setStatethis.forceUpdateReactDom.renderrender, 转换jsx为虚拟dommount调用mountComponentupdate调用updateComponentrequestIdleCallback:
requestIdleCallback处罚频率变得很低scheduler
useState, useReducer, useRef
useState返回的是我们想要的state即可Fiber节点React15使用采用递归的方式创建和更新虚拟dom, 递归的状态不能中断. 如果组件层次深的话, 递归会占用线程很多的时间.
React16使用Fiber架构, 将递归的无法中断的更新重构为异步可中断更新
含义
stack reconciler, React16中的Reconciler基于fiber节点, 称为Reconciler Fiber作为架构:
// 指向父级Fiber节点
/**
* return 指的是当前节点执行完`completeWork`后, 返回的下一个工作单元
*/
this.return = null;
// 指向子Fiber节点
this.child = null;
// 指向右边第一个兄弟Fiber节点
this.sibling = null;
function App() {
return (
<div>
i am
<span>KaSong</span>
</div>
)
}
// Fiber对应组件的类型 Function/Class/Host...
this.tag = tag;
// key属性
this.key = key;
// 大部分情况同type,某些情况不同,比如FunctionComponent使用React.memo包裹
this.elementType = null;
// 对于 FunctionComponent,指函数本身,对于ClassComponent,指class,对于HostComponent,指DOM节点tagName
this.type = null;
// Fiber对应的真实DOM节点
this.stateNode = null;
// 保存本次更新造成的状态改变相关信息
this.pendingProps = pendingProps;
this.memoizedProps = null;
this.updateQueue = null;
this.memoizedState = null;
this.dependencies = null;
this.mode = mode;
// 保存本次更新会造成的DOM操作
/**
* 形成effectList链表, 递归调用所有需要改变的组件
*/
this.effectTag = NoEffect;
this.nextEffect = null;
this.firstEffect = null;
this.lastEffect = null;
// 调度优先级相关
this.lanes = NoLanes;
this.childLanes = NoLanes;
DOM树的创建和更新current fiber树, 内存中对应的fiber树为workInProcess fiber树current fiber和workInProcess fiber 通过alternate链接wipFiber构建完成后, 交给renderer渲染, 渲染完成后, current指向wipFiberwipFiber树, 通过current与wipFiber树的替换, 完成DOM更新ReactDOM.render创建FiberRootNode(源码中称为fiberRoot), 和rootFiber
fiberRootNode为整个应用的根节点, rootFiber为当前render函数中传入组件的根节点current指向的rootFiber没有任何子fiber节点, current fiber树为空.workInProcess fiber树
workInProcess fiber树时, 会尝试复用current fiber树中已有的fiber节点的内在属性rootFiber存在对应的current fiber. rootFiber.alternate => current rootFiberworkInProcess fiber树, 在commit阶段渲染到页面上
workInProcess fiber树对应的样子fiberRootNode更改current指针, 到workInProcess fiber树workInProcess fiber树变为了current fiber树p节点, 触发状态更新, 开启一次新的render阶段, 并构建一颗新的workInProcess fiber树
workInProcess fiber的创建, 可以复用current fiber树对应的数据节点diff算法workInProcess Fiber树在render阶段完成构建后进入到commit阶段渲染到页面上
workInProcess Fiber树变为current Fiber树Fiber树在构建和替换的过程中, 完成dom的更新操作babel编译为React.createElementReactElement工作后, 会返回一个ReactElement, 并使用$$typeof进行标记ReactElement.ClassComponent对应的Element中的type字段为AppClass本身FunctionComponent对应的Element中的type字段为AppFunc本身ClassComponent.prototype.isReactComponent = {};判断是否为ClassComponentfiber节点Fiber节点保存的数据, 进行对比, 生成组件对应的节点. 并根据对比结果为Fiber节点打上tag此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。