这里不再讲useLayoutEffect
,它和useEffect
的代码是一样的,区别主要是:
useEffect
是异步, useLayoutEffect
是同步,会阻塞渲染;在所有hook
初始化时都会通过下面这行代码实现hook
结构的初始化和存储,这里不再讲mountWorkInProgressHook
方法
var hook = mountWorkInProgressHook();
在mountEffect
方法中,只有这几行代码。先来解读下几个参数:
fiber
;function mountEffectImpl(fiberFlags, hookFlags, create, deps) {
// hook初始化
var hook = mountWorkInProgressHook();
// 判断是否有传入deps,如果有会作为下次更新的deps
var nextDeps = deps === undefined ? null : deps;
// 给hook所在的fiber打上有副作用的更新的标记
currentlyRenderingFiber$1.flags |= fiberFlags;
// 将副作用操作存放到fiber.memoizedState.hook.memoizedState中
hook.memoizedState = pushEffect(HasEffect | hookFlags, create, undefined, nextDeps);
}
上面代码中都有注释,接下来我们看看React
是如何存放副作用更新操作的,主要就是pushEffect
方法
function pushEffect(tag, create, destroy, deps) {
// 初始化副作用结构,
var effect = {
tag: tag,
create: create, // 回调函数
destroy: destroy, // 回调函数里的return(mount时是undefined)
deps: deps, // 依赖数组
// 闭环链表
next: null
};
// 下面的一大段代码看着复杂,但是有没有很熟悉的感觉?
var componentUpdateQueue = currentlyRenderingFiber$1.updateQueue;
if (componentUpdateQueue ===