UNPKG

@saber2pr/react

Version:

react in Typescript.

102 lines (101 loc) 3.46 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* * @Author: saber2pr * @Date: 2019-12-06 19:07:32 * @Last Modified by: saber2pr * @Last Modified time: 2019-12-08 12:31:52 */ var ReactFiberWorkLoop_1 = require("./ReactFiberWorkLoop"); var ReactTypes_1 = require("../shared/ReactTypes"); var ReactFiberHostConfig_1 = require("./ReactFiberHostConfig"); var ReactFiberReflection_1 = require("./ReactFiberReflection"); var testStackSize_1 = require("../shared/testStackSize"); var updateQueue = []; var lastTime = 0; function pushEffect(callback) { if (requestIdleCallback) { requestIdleCallback(callback); } else { setTimeout(callback); } } function pushLayoutEffect(callback) { if (requestAnimationFrame) { requestAnimationFrame(callback); } else { var now = Date.now(); var nextTime_1 = Math.max(lastTime + 16, now); return setTimeout(function () { return callback((lastTime = nextTime_1)); }, nextTime_1 - now); } } function scheduleWork(fiber, mode) { if (mode === void 0) { mode = "normal"; } updateQueue.push(fiber); switch (mode) { case "normal": pushEffect(scheduleUnitOfWorkNormalMode); break; case "layout": pushLayoutEffect(scheduleUnitOfWorkLayoutMode); break; default: pushEffect(scheduleUnitOfWorkNormalMode); } } exports.scheduleWork = scheduleWork; function scheduleUnitOfWorkNormalMode() { testStackSize_1.TestStackSize("scheduleUnitOfWorkNormalMode"); var update = updateQueue.pop(); if (update) ReactFiberWorkLoop_1.renderRoot(update); if (updateQueue.length) { pushEffect(scheduleUnitOfWorkNormalMode); } } function scheduleUnitOfWorkLayoutMode() { testStackSize_1.TestStackSize("scheduleUnitOfWorkLayoutMode"); var update = updateQueue.pop(); if (update) ReactFiberWorkLoop_1.renderRoot(update); if (updateQueue.length) { pushLayoutEffect(scheduleUnitOfWorkLayoutMode); } } function createRenderer(HostConfig) { ReactFiberHostConfig_1.setHostConfig(HostConfig); var createContainer = function (component, container, callback) { var rootFiber = { $$typeof: ReactTypes_1.NodeType.Root, props: { children: [component] }, stateNode: container, callback: callback }; HostConfig.removeAllChild(container); scheduleWork(rootFiber); }; var updateContainer = function (component, container, callback) { var rootFiber = { $$typeof: ReactTypes_1.NodeType.Root, props: { children: [component] }, stateNode: container, callback: callback }; var containerFiber = ReactFiberReflection_1.Reflection.getContainerFiber(rootFiber); containerFiber.alternate = null; rootFiber.alternate = containerFiber; scheduleWork(rootFiber); }; var isContainer = function (container) { return ReactFiberReflection_1.Reflection.hasContainerFiber(container); }; return { createContainer: createContainer, updateContainer: updateContainer, isContainer: isContainer }; } exports.createRenderer = createRenderer; exports.default = createRenderer;