@saber2pr/react
Version:
react in Typescript.
122 lines (121 loc) • 3.9 kB
JavaScript
;
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;