React

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > React > react16 hooks底层原理

react16中的hooks的底层实现原理

作者:光影少年

本文主要介绍了react16中的hooks的底层实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

好的 👍,你问的是 React 16 中所有 Hooks 的底层实现和原理

这里我会分几个层次来解释:

  1. React 16 的背景
  2. Hooks 的设计理念
  3. 核心 Hooks 的底层实现思路(useStateuseEffectuseContext, …)
  4. React 内部的 Hook 数据结构
  5. 执行流程(函数组件渲染时 Hook 的调用顺序)

1. 背景:React 16 与 Hooks

2. Hooks 的设计理念

React Hooks 有几个原则:

  1. 只能在函数组件顶层调用,不能在条件语句或循环里动态调用。
    • 这是因为 Hooks 依赖调用顺序来定位。
  2. 只能在 React 函数组件或自定义 Hook 中调用
  3. 每个组件 fiber 节点维护一个单链表,链表节点就是 Hook 对象。

👉 这就是为什么 eslint-plugin-react-hooks 会强制规则:不要在 if/for 中调用 Hook

3. 常见 Hooks 的底层原理

(1)useState

type Hook = {
  memoizedState: any,     // 当前的 state
  baseState: any,         // 初始 state
  queue: UpdateQueue,     // 更新队列(链表结构)
  next: Hook | null       // 指向下一个 Hook
}

(2)useEffect

type Effect = {
  tag: HookFlags,          // effect 类型(Passive, Layout 等)
  create: () => (() => void) | void,  // 副作用函数
  destroy?: () => void,    // 清理函数
  deps: any[] | null,      // 依赖
  next: Effect | null
}

(3)useLayoutEffect

(4)useContext

(5)useReducer

(6)useRef

(7)useMemo/useCallback

4. React 内部 Hook 数据结构

在 fiber 节点上,每个函数组件对应一个 Hook 链表

type Fiber = {
  memoizedState: Hook | null; // hook 链表头
  updateQueue: any;
  // ...
}

5. Hook 执行流程总结

  1. 初次渲染
    • 执行函数组件,依次调用 useState / useEffect …
    • 为每个 Hook 创建一个 Hook 节点,挂到 fiber.memoizedState 链表上。
  2. 更新渲染
    • 执行组件时,React 会遍历 fiber.memoizedState 链表。
    • 每次调用 Hook,就拿到对应节点,复用之前的状态。
    • 如果调用顺序错了(比如把 Hook 放到 if 里),链表错位,React 会报错。
  3. 提交阶段(commit phase)
    • 对于 useEffect / useLayoutEffect,会根据依赖比较来执行副作用。
    • 对于 useState / useReducer,会处理更新队列,得到新 state。

✅ 总结:

到此这篇关于react16中的hooks的底层实现原理的文章就介绍到这了,更多相关react16 hooks底层原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文