Hook类型定义
typescript
export type Hook = {
memoizedState: any,
baseState: any,
baseUpdate: Update<any, any> | null,
queue: UpdateQueue<any, any> | null,
next: Hook | null,
};mountWorkInProgressHook
在hooks第一次创建的时候调用,生成一个hook对象,并构建一个链表结构
typescript
function mountWorkInProgressHook(): Hook {
const hook: Hook = {
memoizedState: null,
baseState: null,
queue: null,
baseUpdate: null,
next: null,
};
if (workInProgressHook === null) {
// firstWorkInProgressHook 指向链表的第一个
// workInProgressHook 指向链表的最后一个
// 一开始,构建链表
firstWorkInProgressHook = workInProgressHook = hook;
} else {
// 将当前的hook添加到链表的最后一个
workInProgressHook = workInProgressHook.next = hook;
}
// 返回
return workInProgressHook;
}updateWorkInProgressHook
typescript
function updateWorkInProgressHook(): Hook {
if (nextWorkInProgressHook !== null) {
// 还没有更新完,都更新全局变量,都指向下一个即将更新的hook
workInProgressHook = nextWorkInProgressHook;
nextWorkInProgressHook = workInProgressHook.next;
currentHook = nextCurrentHook;
nextCurrentHook = currentHook !== null ? currentHook.next : null;
} else {
// 当组件更新的时候,nextWorkInProgressHook一开始是没有值得
// 会走到这
// 如果存在hook存在于条件语句中,此时多出来了Hook需要执行,会走到这
currentHook = nextCurrentHook;
// 创建一个新的hook对象
const newHook: Hook = {
memoizedState: currentHook.memoizedState,
baseState: currentHook.baseState,
queue: currentHook.queue,
baseUpdate: currentHook.baseUpdate,
next: null,
};
// 构建链表的过程
if (workInProgressHook === null) {
// This is the first hook in the list.
workInProgressHook = firstWorkInProgressHook = newHook;
} else {
// Append to the end of the list.
workInProgressHook = workInProgressHook.next = newHook;
}
nextCurrentHook = currentHook.next;
}
return workInProgressHook;
}注意
hooks是不能写在if else 里面的,因为在实现上是通过fiber链表来串联的,
当写在if else里面会出现执行的hook与实际不符合
Hook组件执行过程中的一些全局变量
renderExpirationTime
设置当前的nextRenderExpirationTime
currentlyRenderingFiber
当前正在执行的组件对应的work-in-progress Fiber对象
currentHook & nextCurrentHook
hooks是存储在Fiber阶段的memoizedState属性上的一个链表 当前的hook链表的数据当前正在执行的Fiber(currentlyRenderingFiber), hooks的链表将会添加到work-in-progress fiber上面
firstWorkInProgressHook
用来将当前组件内的Hook都链接起来 形成链表
也就是链表的第一个节点
workInProgressHook
用来将当前组件内的Hook都链接起来 形成链表
也就是链表的最后一个节点
nextWorkInProgressHook
下一个即将更新的hook