Skip to content
目录

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

备案号: 浙ICP备2023000081号