前端/移动开发面试题更新 2026-08-05

在 React 中,为什么官方不主张直接修改 state?当确实需要更新 state 时,应该采用什么样的操作方式?

前端/移动开发编码实现技术原理React

考察说明

考察对 React 状态管理核心机制的理解,以及正确更新 state 的实践能力。

回答思路

  1. 【回答框架 1】React 中 state 被视为不可变数据,直接修改会绕过 setState 的更新流程,导致组件不会重新渲染或渲染异常。因为 React 通过浅比较 state 的引用来判断是否变化,直接修改对象或数组的属性时,引用未改变,React 无法检测到更新。
  2. 【回答框架 2】正确操作是使用 setState(类组件)或 useState 返回的更新函数(函数组件)来更新 state。这些函数会触发重新渲染,并能基于当前 state 计算新值,例如使用函数式更新(setState(prev => ...))来避免闭包陷阱。
  3. 【回答框架 3】对于对象或数组,应创建新副本再更新,如使用展开运算符或 concat、map 等方法,保持不可变性。这样可以确保引用变化,React 能准确渲染,也有利于后续优化(如 memo)和状态回溯。
  4. 【回答框架 4】React 可能在批处理中合并多个 setState 调用,但直接修改 state 会破坏这一机制,造成不一致的 UI 和数据流。遵循不可变性也符合单向数据流的设计原则,便于调试和测试。
  5. 【关键点 1】直接修改 state 不会触发重新渲染,因为 React 依赖引用比较检测变化。
  6. 【关键点 2】必须通过 setState 或 useState 的更新函数来更新 state。
  7. 【关键点 3】更新对象或数组时,要创建新值(如展开运算符)保持不可变性。
  8. 【关键点 4】使用函数式更新可基于最新 state 计算,避免过期数据。
  9. 【关键点 5】不可变更新有助于优化和可预测性。
  10. 【易错点 1】误以为直接修改 state 可以生效,实际 React 可能忽略或导致渲染异常。
  11. 【易错点 2】在异步回调或事件中直接修改 state,可能因批处理导致更新丢失。
  12. 【易错点 3】更新 state 时,如果直接修改嵌套对象而不生成新引用,会导致子组件不更新或出现性能问题。