Appearance
React Hooks 全景图:从基础到进阶的完整指南
随着React的日益膨胀,React Hooks 的家族也在不断壮大,早已不是当初那般简洁,在某一种程度上可以被称为臃肿。从 React 16.8 版本首次引入 Hooks 概念以来,经过 React 18 的迭代,再到 React 19 的新增,Hooks 已经成为 React 开发中不可或缺的一部分。它们使得函数组件也能拥有状态管理、副作用处理、性能优化等能力。
大体上,可以将 React 的 Hooks 分为以下几类:
状态管理 (State Management)
这些 Hooks 用于在组件内部管理和更新状态。
useState: 声明一个状态变量,可以直接更新。useReducer: 当状态逻辑较为复杂或下一个状态依赖于前一个状态时使用,通过 reducer 函数管理状态。useActionState(React 19 新增,原useFormState): 管理与表单提交或异步操作相关的状态,简化加载、错误和数据状态的处理。useOptimistic(React 19 新增): 用于实现乐观更新,即时更新 UI 以提升用户体验,同时在后台处理实际的数据变更。
副作用处理 (Side Effect Handling)
这些 Hooks 用于处理组件渲染之外的操作,如数据获取、订阅或手动更改 DOM。
useEffect: 连接组件到外部系统,在组件渲染后执行副作用操作。useLayoutEffect: 与useEffect类似,但在浏览器执行绘制之前同步触发。常用于读取布局信息并同步触发重新渲染。useInsertionEffect(React 18 新增): 主要供 CSS-in-JS 库使用,在 React 对 DOM 进行更改之后,但在useLayoutEffect读取新布局之前同步触发,用于动态插入 CSS 规则。
性能优化 (Performance Optimization)
这些 Hooks 用于避免不必要的计算和重新渲染,从而提升应用性能。
useMemo: 缓存计算结果,只有当依赖项改变时才重新计算。useCallback: 缓存函数定义,避免在子组件中因函数引用的改变而导致不必要的重新渲染。useTransition(React 18 新增): 允许将某些状态更新标记为非阻塞的“过渡”,使得 UI 可以在更新过程中保持响应。useDeferredValue(React 18 新增): 允许推迟更新 UI 的非关键部分,让其他部分优先更新,从而改善感知性能。
上下文处理 (Context Handling)
这些 Hooks 用于在组件树中共享数据,而无需通过 props 逐层传递。
useContext: 读取并订阅一个 Context 对象。
引用管理 (Ref Management)
这些 Hooks 用于创建和管理 refs,通常用于访问底层的 DOM 元素或在组件间传递可变值。
useRef: 创建一个可变的 ref 对象,其.current属性被初始化为传入的参数。ref 对象在组件的整个生命周期内保持不变。useImperativeHandle: 与forwardRef配合使用,自定义暴露给父组件的 ref 实例值。
表单处理 (Form Handling)
React 19 引入了专门用于简化表单处理的 Hooks。
useFormStatus(React 19 新增): 提供父级<form>提交状态的信息(如pending,data,method,action),方便子组件根据表单提交状态进行响应。需要从react-dom导入。
其他 Hooks (Other Hooks)
这些 Hooks 用于一些特定的场景或辅助开发。
useDebugValue: 用于在 React 开发者工具中为自定义 Hook 显示标签。useId(React 18 新增): 生成稳定的、唯一的 ID,可用于关联 HTML 元素的id和aria-*属性,以增强可访问性。useSyncExternalStore(React 18 新增): 允许组件安全地订阅外部数据源,并确保在数据变化时能够正确地重新渲染。use(React 19 新增): 这是一个多功能的 API (严格来说并非传统意义上的 Hook,因为它可以在条件语句和循环中调用),可以用于在组件内部直接等待 Promise 的结果,或读取 Context 的值,简化了异步数据获取和 Context 消费的模式。
