Open zbzalex opened 1 year ago
add global variable
let pendingEffects = []
cerate a hook and add effects tag
function useEffect(fn, deps) { const hook = { tag: "EFFECT", fn, deps, } wipFiber._hooks.push(hook) hookIndex++ }
modify performUnitOfWork function
if (isFunctionComponent) { ... Object .keys(wipFiber._hooks) .filter(hookIndex => wipFiber._hooks[hookIndex].tag === "EFFECT") .forEach(hookIndex => { const oldHook = wipFiber.alternate && wipFiber.alternate._hooks && wipFiber.alternate._hooks[hookIndex] const hook = wipFiber._hooks[hookIndex] const depsChanged = (prev, next) => (_, index) => prev[index] !== next[index]; if (hook.deps.length === 0 && !oldHook || oldHook && (oldHook.deps.length !== hook.deps.length || oldHook && hook.deps.filter(depsChanged(oldHook.deps, hook.deps)).length !== 0)) { pendingEffects.push(hook.fn) } }) ...
go to commitRoot function
... pendingEffects.forEach(it => it()) // call pending effects after render
Modification project https://github.com/zbzalex/react-lite
add global variable
cerate a hook and add effects tag
modify performUnitOfWork function
go to commitRoot function