ReactFiberReconciler
createContainer | |
---|---|
updateContainer | |
updateContainerAtExpirationTime |
return {
createContainer(
containerInfo: C,
isAsync: boolean,
hydrate: boolean,
): OpaqueRoot {
return createFiberRoot(containerInfo, isAsync, hydrate);
},
updateContainer(
element: ReactNodeList,
container: OpaqueRoot,
parentComponent: ?React$Component<any, any>,
callback: ?Function,
): ExpirationTime {
const current = container.current;
const currentTime = recalculateCurrentTime();
const expirationTime = computeExpirationForFiber(current);
return updateContainerAtExpirationTime(
element,
container,
parentComponent,
currentTime,
expirationTime,
callback,
);
},
updateContainerAtExpirationTime(
element,
container,
parentComponent,
expirationTime,
callback,
) {
const currentTime = recalculateCurrentTime();
return updateContainerAtExpirationTime(
element,
container,
parentComponent,
currentTime,
expirationTime,
callback,
);
},
flushRoot,
requestWork,
computeUniqueAsyncExpiration,
batchedUpdates,
unbatchedUpdates,
deferredUpdates,
syncUpdates,
interactiveUpdates,
flushInteractiveUpdates,
flushControlled,
flushSync,
getPublicRootInstance(
container: OpaqueRoot,
): React$Component<any, any> | PI | null {
const containerFiber = container.current;
if (!containerFiber.child) {
return null;
}
switch (containerFiber.child.tag) {
case HostComponent:
return getPublicInstance(containerFiber.child.stateNode);
default:
return containerFiber.child.stateNode;
}
},
findHostInstance,
findHostInstanceWithNoPortals(fiber: Fiber): PI | null {
const hostFiber = findCurrentHostFiberWithNoPortals(fiber);
if (hostFiber === null) {
return null;
}
return hostFiber.stateNode;
},
injectIntoDevTools(devToolsConfig: DevToolsConfig<I, TI>): boolean {
const {findFiberByHostInstance} = devToolsConfig;
return ReactFiberDevToolsHook.injectInternals({
...devToolsConfig,
findHostInstanceByFiber(fiber: Fiber): I | TI | null {
return findHostInstance(fiber);
},
findFiberByHostInstance(instance: I | TI): Fiber | null {
if (!findFiberByHostInstance) {
// Might not be implemented by the renderer.
return null;
}
return findFiberByHostInstance(instance);
},
});
},
};
updateContainerAtExpirationTime
function updateContainerAtExpirationTime(
element: ReactNodeList,
container: OpaqueRoot,
parentComponent: ?React$Component<any, any>,
currentTime: ExpirationTime,
expirationTime: ExpirationTime,
callback: ?Function,
) {
// TODO: If this is a nested container, this won't be the root.
const current = container.current;
const context = getContextForSubtree(parentComponent);
if (container.context === null) {
container.context = context;
} else {
container.pendingContext = context;
}
return scheduleRootUpdate(
current,
element,
currentTime,
expirationTime,
callback,
);
}
scheduleRootUpdate
The function callsinsertUpdateIntoFiber
and scheduleWork
.
function scheduleRootUpdate(
current: Fiber,
element: ReactNodeList,
currentTime: ExpirationTime,
expirationTime: ExpirationTime,
callback: ?Function,
) {
callback = callback === undefined ? null : callback;
const update = {
expirationTime,
partialState: {element},
callback,
isReplace: false,
isForced: false,
capturedValue: null,
next: null,
};
insertUpdateIntoFiber(current, update);
scheduleWork(current, expirationTime);
return expirationTime;
}