React副作用与外部系统同步总览

React 中 effect 类 Hook 与网络、DOM、订阅、第三方系统之间的同步边界总览。

#tech / dev / frame #resource / react #type / synthesis #status / growing

[!info] related notes

React副作用与外部系统同步总览

React 里的 effect 相关问题,核心不是“记住依赖数组怎么写”,而是先判断:这段逻辑是不是在和 React 外部系统同步。

为什么要放在一起理解

因为 useEffectuseLayoutEffect 经常被误当成“渲染后随便写逻辑的地方”,但它们真正服务的是同步外部系统。

什么叫外部系统

  • 网络请求
  • DOM API
  • 定时器
  • 事件订阅
  • 第三方库实例

为什么要先理解这层,而不是先背 useEffect

因为很多 React 问题的根源不是“依赖数组不会写”,而是压根没先判断这段逻辑该不该进 effect。

这层判断比 API 细节更重要:

  1. 只是根据数据算 UI 吗
  2. 只是响应一次用户事件吗
  3. 还是说状态变化后,真的需要把外部世界同步成这个状态

只有第 3 类,才是真正的 effect 视角。

两个常见入口

useEffect

适合大多数普通副作用同步场景。

useLayoutEffect

适合必须在浏览器绘制前完成的布局相关副作用。

一条实用判断线

  1. 只是渲染逻辑?不要进 effect
  2. 只是事件响应?优先放事件函数
  3. 真的是状态变化后要和外部系统同步?再进入 effect

一个典型对比

不该进 effect 的:

const fullName = firstName + ' ' + lastName

更像 effect 的:

useEffect(() => {
  const id = window.setInterval(tick, 1000)
  return () => window.clearInterval(id)
}, [tick])

前者是渲染计算,后者是和定时器系统建立同步关系。

常见误区

  • 把所有异步逻辑都塞进 useEffect
  • 依赖数组只靠“试出来”而不是理解依赖来源
  • 把 effect 当成“生命周期替代品大全”

最短记忆方式

effect 不负责描述 UI,本质负责描述“组件如何和外部世界保持同步”。

创建于 2026/3/19 更新于 2026/5/27