@saber2pr/react
Version:
react in Typescript.
126 lines (125 loc) • 4.66 kB
JavaScript
;
var __spreadArrays = (this && this.__spreadArrays) || function () {
for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;
for (var r = Array(s), k = 0, i = 0; i < il; i++)
for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)
r[k] = a[j];
return r;
};
Object.defineProperty(exports, "__esModule", { value: true });
/*
* @Author: saber2pr
* @Date: 2019-12-06 17:12:44
* @Last Modified by: saber2pr
* @Last Modified time: 2019-12-10 16:46:47
*/
var ReactTypes_1 = require("../shared/ReactTypes");
var ReactFiberReflection_1 = require("./ReactFiberReflection");
var ReactChildFiber_1 = require("./ReactChildFiber");
var ReactFiberCommitWork_1 = require("./ReactFiberCommitWork");
var ReactIs_1 = require("../react-is/ReactIs");
var ReactFiberStack_1 = require("./ReactFiberStack");
var testStackSize_1 = require("../shared/testStackSize");
var workInProgress = null;
var pendingCommit = null;
var getCurrentWorkInProgress = function () { return workInProgress; };
exports.getCurrentWorkInProgress = getCurrentWorkInProgress;
function renderRoot(root) {
if (!workInProgress)
workInProgress = createWorkInProgress(root);
while (workInProgress) {
workInProgress = performUnitOfWork(workInProgress, root);
if (workInProgress === root)
break;
testStackSize_1.TestStackSize("renderRoot");
}
if (pendingCommit) {
ReactFiberCommitWork_1.commitWork(pendingCommit);
workInProgress = null;
pendingCommit = null;
}
}
exports.renderRoot = renderRoot;
function createWorkInProgress(fiber) {
workInProgress = fiber;
workInProgress.effectList = null;
return workInProgress;
}
function performUnitOfWork(fiber, top) {
var next = beginWork(fiber);
if (next)
return next;
var current = fiber;
while (current) {
if (current === top)
return current;
completeWork(current, top);
if (current.sibling)
return current.sibling;
current = current.return;
testStackSize_1.TestStackSize("performUnitOfWork");
}
}
function completeWork(fiber, top) {
var parent = fiber.return;
if (parent) {
var parentEffectList = parent.effectList || [];
var fiberEffectList = fiber.effectList || [];
parentEffectList.push.apply(parentEffectList, __spreadArrays(fiberEffectList, [fiber]));
fiber.effectList = [];
delete fiber.effectList;
// update effect.
if (ReactIs_1.isHookFiber(parent) && parent.effectType === ReactTypes_1.EffectType.Update) {
parentEffectList.push(parent);
}
parent.effectList = parentEffectList;
if (parent === top) {
pendingCommit = parent;
}
}
}
function beginWork(fiber) {
if (ReactIs_1.isHookFiber(fiber)) {
return updateHOOKComponent(fiber);
}
if (ReactIs_1.isRootFiber(fiber)) {
return updateHostComponent(fiber);
}
if (ReactIs_1.isTextFiber(fiber)) {
return updateHostComponent(fiber);
}
if (ReactIs_1.isHostFiber(fiber)) {
return updateHostComponent(fiber);
}
if (ReactIs_1.isFragmentFiber(fiber)) {
return updateHostComponent(fiber);
}
}
function updateHOOKComponent(hookFiber) {
var constructor = hookFiber.tag, props = hookFiber.props;
hookFiber.alternate = ReactFiberReflection_1.Reflection.getInternalFiber(hookFiber);
if (props.children && props.children.length === 1) {
var singleChild = props.children[0];
if (ReactIs_1.isTextFiber(singleChild)) {
var props_1 = singleChild.props;
singleChild = props_1.nodeValue;
}
props.children = singleChild;
}
ReactFiberStack_1.resetIndex();
var children = constructor(props);
var child = ReactChildFiber_1.reconcileChildren(hookFiber, children);
hookFiber.child = child;
return child;
}
function updateHostComponent(hostFiber) {
var children = hostFiber.props.children, stateNode = hostFiber.stateNode, alternate = hostFiber.alternate;
var isSame = alternate ? ReactIs_1.isSameTag(hostFiber, alternate) : false;
if (!stateNode || !isSame) {
hostFiber.stateNode = ReactFiberCommitWork_1.createStateNode(hostFiber);
ReactFiberCommitWork_1.commitUpdate(hostFiber);
}
var child = ReactChildFiber_1.reconcileChildren(hostFiber, children);
hostFiber.child = child;
return child;
}