前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库React useEffect 与外部系统同步
ReReact副作用与同步

React 所说的“用 Effect 与外部系统同步”具体是什么意思?

同步是让 React 之外的某个资源或状态,持续对应组件当前已提交的输入。

前端进阶之旅 · 一题精讲更新于 2026.09.06
React#副作用与同步#Effect
先看核心答案
理解线索

识别逻辑的三种目的

  1. 描述界面用当前输入计算文字、列表和可见状态
  2. 执行命令用户明确要求提交、下载或打开某个对象
  3. 维持关系展示某对象期间持续连接对应资源或订阅

Effect 应能够重新开始与结束;不要让正确性依赖某个组件一生只建立一次资源。

核心回答

先记住这个答案

React 可以根据 props 和 state 计算 JSX,却不会自动控制所有命令式系统,例如浏览器事件订阅、第三方地图实例或实时连接。Effect 用来建立这些外部关系,并在相关输入变化后更新或重新建立,必要时清理旧资源。它不是“渲染后任意执行代码”的默认位置:能直接计算的展示值留在渲染中,由一次点击引起的命令通常留在事件处理器中。

  • 外部系统不只指远程服务,也包括浏览器 API 和第三方实例
  • 同步关系应说明输入、建立方式与结束方式
  • 纯计算、用户命令和持续同步分别表达

为什么 JSX 不能自动控制第三方地图

假设页面 state 保存 zoom,而第三方地图只提供 setZoom 这样的命令式接口。渲染一个显示 zoom 的文本,只会改变 React 管理的界面,不会自动通知地图实例。同步逻辑需要把当前 zoom 传给地图 API,使地图视角与页面输入对应起来。

此处“外部”指不由 React 的声明式渲染直接管理,并不要求跨网络。浏览器事件源、媒体播放对象、定时器和嵌入式编辑器都可能属于这一类。反过来,筛选数组虽然是额外计算,却不因为写在 JSX 外面就成为外部系统,通常可以直接根据输入计算。

把资源建立与参数同步分清楚

一个地图实例可能在组件挂载期间保留,而缩放级别会多次变化。应根据地图 API 的生命周期区分创建实例、更新参数和释放实例,避免每次 zoom 改变都销毁重建整个地图。若资源只在一个同步周期内有效,就让该轮清理持有它自己的句柄。

订阅当前文档则可能在 documentId 变化时需要结束旧连接并建立新连接。两种例子都属于同步,但资源是否可复用、哪些输入要求重建并不相同。不能机械复制一个空依赖初始化加一个万能更新 Effect,而应先看外部 API 对实例和参数的实际约束。

用输入变化与退出场景检验同步设计

验收时除了首次显示,还应切换外部对象、修改配置、离开页面再返回,确认资源始终对应当前输入,并且旧一轮不再影响界面。异步结果可能迟到,应检查取消与轮次判断;共享资源则应区分所有者销毁与消费者取消订阅。

Effect 只在客户端执行,因此服务端 HTML 中需要的正文和初始数据不能等待它补齐。客户端资源可以在挂载后连接,但初始界面应有清楚的可用状态。若任务只是点击按钮发送一条消息,也不必先把消息命令转换成 state 再由 Effect 猜测是否该发送。

回答前,多想一步

容易答错的地方

凡是 render 里不方便写的代码都放 Effect
位置不方便不是同步需求的证据。先判断代码是纯计算、用户动作还是与外部资源维持关系,再选择适合的组织方式,避免 Effect 之间不断设置状态形成链条。
没有网络请求就没有外部系统
外部系统也可能就在当前浏览器中。全局事件、第三方控件和定时器各有自己的生命周期,React 不会因为组件返回了一段 JSX 就自动建立或解除这些关系。
试着用自己的话回答

面试官还会怎么问?

同步外部控件都需要返回 cleanup 吗?

取决于建立了什么资源。监听、连接和需要显式销毁的实例应配对释放;只调用某个幂等更新方法且没有额外持有资源的同步,不一定需要虚构一个清理操作。

为什么不在组件函数里直接连接?

渲染可能被重复执行或放弃,函数体应保持纯粹。提前建立连接会让外部资源与未提交的渲染纠缠,也缺少清楚的清理配对,因此应使用合适的生命周期管理。

两个同步过程可以写在同一个 Effect 吗?

可以,但应确认它们确实共享同一重同步条件和资源生命周期。无关关系混在一起会让一个输入变化重复执行另一件事,分开往往更容易声明正确依赖与清理。

从一道题,走向一组知识

把知识连起来

副作用与同步

用户点击触发的逻辑为什么通常放事件处理器,而不是 useEffect?

一次用户命令与持续匹配当前输入的同步,需要分开组织。

副作用与同步

React Effect 忘记清理订阅,路由切换后会出现什么问题?

外部订阅建立之后,还要在离开或切换对象时正确释放。

副作用与同步

React useEffect 一定在浏览器绘制后执行吗?

确认同步目的后,再区分提交与浏览器绘制,决定是否需要更严格的布局时机。

参考资料

  • Synchronizing with Effects
  • React useEffect

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 为什么 JSX 不能自动控制第三方地图
  3. 把资源建立与参数同步分清楚
  4. 用输入变化与退出场景检验同步设计
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑