React 状态上提与状态下沉

React 中状态上提与状态下沉的适用场景、取舍,以及它们如何影响共享逻辑和渲染边界。

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

[!info] related notes

React 状态上提与状态下沉

React 里“状态放在哪里”不是代码风格问题,而是共享关系、组件职责和渲染范围的共同结果。

一句话定义

状态上提是把多个组件共同需要的数据提升到它们的共同父层;状态下沉是把只服务局部交互的状态留在更靠近使用位置的组件里。

为什么这组概念要放在一起理解

  • 它们都在回答同一个问题:状态到底该放哪
  • 上提解决共享,下沉控制边界
  • 真正好的设计通常不是极端选择,而是按使用范围决定位置

什么时候应该状态上提

  • 多个兄弟组件需要读写同一份状态
  • 某个交互结果要驱动多个区域联动
  • 需要把共享状态作为单一事实来源维护

什么时候应该状态下沉

  • 状态只影响局部 UI 交互
  • 某个输入框、弹窗开关、hover 状态只在局部使用
  • 放在父层只会扩大无关组件的重新执行范围

一个常见判断方法

  • 先问谁真正需要这份状态
  • 如果只有一个局部子树需要,就先别急着上提
  • 如果多个并列组件都要消费,再考虑提到共同父层

常见误区

  • 以为状态越集中越好
  • 以为“减少 prop 传递”就一定要把状态提到更高层
  • 只看共享关系,不看渲染传导范围和组件职责

最短记忆方式

共享需求推动上提,局部交互更适合下沉。

面试要点

来自 react-state-lifting-vs-state-colocation-interview-question 的面试视角整理。

一句话回答

如果多个组件需要共享同一份状态,通常要上提到共同父层;如果状态只服务局部交互,就应该尽量下沉到更靠近使用位置的组件里,这样更容易控制渲染范围和组件职责。

最稳的回答主线

  • 先看状态影响几个组件
  • 共享范围大,就上提到共同父层
  • 只影响局部交互,就别放到高层制造联动
  • 最后补一句:状态位置不仅影响数据流,也影响 rerender 传导范围

面试里容易加分的一句

React 性能优化很多时候不是先上 memo,而是先把状态放到合适的位置,因为状态边界本身就决定了哪些组件会被带动重新执行。

常见追问

  • 状态上提是不是越多越好
  • 怎么避免为了共享状态把整个页面都提成大父组件
  • 本地状态和 Context 的边界怎么划分

最短记忆方式

共享就上提,局部就下沉。

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