updateMode
1 ) 概述
Mode组件是 react提供给我们的原生组件- 一共有两个:
ConcurrentMode和StrictMode - 对于这两个 Mode 的更新过程最终调用的都是
updateMode的方法 - 它们执行的过程非常的简单,就是通过
reconcileChildren去创建children就可以了
- 一共有两个:
2 )源码
定位到 packages/react-reconciler/src/ReactFiberBeginWork.js#L349
进入 updateMode
function updateMode(
current: Fiber | null,
workInProgress: Fiber,
renderExpirationTime: ExpirationTime,
) {
const nextChildren = workInProgress.pendingProps.children;
reconcileChildren(
current,
workInProgress,
nextChildren,
renderExpirationTime,
);
return workInProgress.child;
}
- 为什么它们可以这么简单的直接调用,这个组件又有什么意义呢?
- 进入
reconcileChildren里面的寻找答案- 进入
reconcileChildFibers再随便选一个api进入,比如reconcileSingleElement - 再进入
createFiberFromElement// packages/react-reconciler/src/ReactFiber.js#L520 export function createFiberFromElement( element: ReactElement, mode: TypeOfMode, expirationTime: ExpirationTime, ): Fiber { let owner = null; if (__DEV__) { owner = element._owner; } const type = element.type; const key = element.key; const pendingProps = element.props; const fiber = createFiberFromTypeAndProps( type, key, pendingProps, owner, mode, expirationTime, ); if (__DEV__) { fiber._debugSource = element._source; fiber._debugOwner = element._owner; } return fiber; }- 这里 第二个参数 是 mode, 调用的时候,是
const created = createFiberFromElement( element, returnFiber.mode, // 这里 expirationTime, ); - 这个
returnFiber对应着updateMode中的 current 或 workInProgress - 看下 ReactFiber.js 中的
createFiberFromElement- 进入到
createFiberFromTypeAndProps- 再找到
fiber = createFiber(fiberTag, pendingProps, key, mode); - 这里的mode会设置到当前调和的子节点上
- 再找到
- 进入到
- 也就是当前正在更新的节点,如果是更新 Mode 组件的父组件,调和 Mode 组件
- 参考: packages/react-reconciler/src/ReactFiber.js#L442
- 对应到 Mode节点来说,就可能是 ConcurrentMode 对应的 Fiber 对象
- 其
returnFiber.mode对应REACT_CONCURRENT_MODE_TYPE,参考case REACT_CONCURRENT_MODE_TYPE: return createFiberFromMode( pendingProps, mode | ConcurrentMode | StrictMode, // 这里就是,最终结果: 0b011 expirationTime, key, );
- 其
- 如果是 StrictMode 对应的 Fiber 对象
- 其
returnFiber.mode对应REACT_STRICT_MODE_TYPE, 参考case REACT_STRICT_MODE_TYPE: return createFiberFromMode( pendingProps, mode | StrictMode, // 这里就是,最终结果: 0b010 expirationTime, key, );
- 其
- 这里 第二个参数 是 mode, 调用的时候,是
- 进入
441



被折叠的 条评论
为什么被折叠?



