UNPKG

@saber2pr/react

Version:

react in Typescript.

126 lines (125 loc) 4.66 kB
"use strict"; 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; }