UNPKG

@saber2pr/react

Version:

react in Typescript.

122 lines (121 loc) 3.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /* * @Author: saber2pr * @Date: 2019-12-06 17:11:09 * @Last Modified by: saber2pr * @Last Modified time: 2019-12-10 21:01:24 */ var ReactFiberWorkLoop_1 = require("./ReactFiberWorkLoop"); var ReactFiberReconciler_1 = require("./ReactFiberReconciler"); var ReactFiberStack_1 = require("./ReactFiberStack"); var objectIs_1 = require("../shared/objectIs"); var areHookInputsEqual = function (nextDeps, prevDeps) { if (prevDeps === null) { return false; } for (var i = 0; i < prevDeps.length && i < nextDeps.length; i++) { if (objectIs_1.is(nextDeps[i], prevDeps[i])) { continue; } return false; } return true; }; var useState = function (initialState) { var id = ReactFiberStack_1.getIndex(); var fiber = ReactFiberWorkLoop_1.getCurrentWorkInProgress(); var memoizedState = fiber.memoizedState || {}; if (!(id in memoizedState)) { memoizedState[id] = initialState; fiber.memoizedState = memoizedState; } var setState = function (state) { if (state === memoizedState[id]) return; memoizedState[id] = state; ReactFiberReconciler_1.scheduleWork(fiber); }; return [memoizedState[id], setState]; }; exports.useState = useState; var useReducer = function (initReducer, initialState, initAction) { var reducer = useCallBack(initReducer); var initState = initAction ? reducer(initialState, initAction) : initialState; var _a = useState(initState), state = _a[0], setState = _a[1]; var dispatch = function (action) { return setState(reducer(state, action)); }; return [state, dispatch]; }; exports.useReducer = useReducer; var useRef = function (value) { var state = useState({ current: value })[0]; return state; }; exports.useRef = useRef; var useCallBack = function (callback, deps) { var ref = useRef(callback); var prevDepsRef = useRef(null); if (deps && areHookInputsEqual(deps, prevDepsRef.current)) { return ref.current; } else { ref.current = callback; prevDepsRef.current = deps; return callback; } }; exports.useCallBack = useCallBack; var useMemo = function (memoFunc, deps) { var ref = useRef(null); var prevDepsRef = useRef(null); if (deps && areHookInputsEqual(deps, prevDepsRef.current)) { return ref.current; } else { ref.current = memoFunc(); prevDepsRef.current = deps; return ref.current; } }; exports.useMemo = useMemo; var pushEffect = function (effect, create) { var sideEffect = effect || {}; var updateQueue = sideEffect.in || []; updateQueue.push(create); sideEffect.in = updateQueue; return sideEffect; }; var useEffect = function (create, deps) { var fiber = ReactFiberWorkLoop_1.getCurrentWorkInProgress(); var effect = fiber.memoizedState; var prevDepsRef = useRef(null); if (deps && areHookInputsEqual(deps, prevDepsRef.current)) { return; } else { prevDepsRef.current = deps; fiber.memoizedState = pushEffect(effect, create); } }; exports.useEffect = useEffect; var useImperativeHandle = function (ref, creator, deps) { var prevDepsRef = useRef(null); if (deps && areHookInputsEqual(deps, prevDepsRef.current)) { return; } else { prevDepsRef.current = deps; var ret = creator(); if (typeof ref === "function") { ref(ret); } else { ref.current = ret; } } }; exports.useImperativeHandle = useImperativeHandle; var useContext = function (context) { return context.value; }; exports.useContext = useContext;