React 讨论状态管理时,最容易一上来就进入“选库模式”,好像答案永远是 Redux、Zustand、Context 三选一。可真正成熟的判断,应该先回到状态本身:它到底属于哪一层、生命周期多长、共享范围多大、是不是来自服务端。只要这个问题没先想清楚,再好的状态库都会被用成杂物间。
为什么 React 状态管理真正难的不是库,而是边界?
因为真实项目里的状态天然就不是一类东西。你会同时遇到:
- 组件局部状态;
- 少量全局共享上下文;
- 高频业务共享状态;
- 服务端数据和缓存;
- URL 状态。
如果一上来就试图用同一套方案承接所有状态,结果通常是:
- 本地临时状态被抬得过高;
- 服务端数据和客户端 UI 状态混在一起;
- Context 被当成轻量 store 滥用;
- Redux 或 Zustand 承接了大量本不该共享的内容。
Context 真正适合承接什么?
Context 更适合少量稳定共享的上下文信息,比如:
- 当前主题;
- 语言环境;
- 认证信息;
- 某个组件族的局部上下文;
- 低频但需要跨层共享的能力。
它的价值是避免层层透传,但它不等于高频业务状态容器。如果把大量频繁变化的业务状态塞进 Context,后面渲染和边界管理都会变得很难受。
Redux 为什么很多团队依然会继续用?
因为 Redux 最大的价值,从来不只是“功能多”,而是它非常适合:
- 状态流明确;
- 团队协作规范强;
- 大项目里需要统一约束;
- 需要比较清晰的状态变更路径。
也正因为如此,它在某些成熟团队和存量系统里依然很有现实价值。它的代价通常是样板和心智门槛更高,但换来的往往是更强的约束性。
Zustand 为什么越来越常见?
因为它更轻,也更贴合很多 React 项目对共享状态的实际需求。对于不少中型项目来说,它的优势在于:
- 上手快;
- 心智负担相对低;
- 能比较自然地承接一部分全局状态;
- 不会像 Redux 那样默认引入整套更重的流程感。
但更轻不代表可以失去边界。只要状态设计本身混乱,Zustand 也一样会长成大型共享黑箱。
服务端状态为什么应该单独拿出来看?
因为它和普通客户端状态真的不是一类问题。服务端状态天然还要处理:
- 请求生命周期;
- 缓存与失效;
- 刷新与重试;
- 乐观更新;
- 分页和搜索;
- 错误恢复。
这些问题本质上是“远程数据协作问题”,而不是普通 state 存哪里的问题。所以很多 React 项目真正成熟起来,恰恰是从这里开始意识到:服务端状态不该简单硬塞进客户端 store。
库选择放回项目里,真正该怎样判断?
一个更稳的顺序通常是:
1. 先分清局部状态、共享状态和服务端状态;2. 少量稳定上下文优先考虑 Context;3. 明确高频共享业务状态,再看是否需要 Redux 或 Zustand;4. 服务端状态优先围绕请求生命周期建模,而不是先问全局 store 怎么放;5. 统一团队规则比个人偏好更重要。
最常见的几个误区
1. 把 Context 当作“轻量全局状态万能解”
高频复杂状态放进去后很容易失控。
2. 所有状态都塞 Redux 或 Zustand
会让共享层越来越重。
3. 服务端数据和本地 UI 状态混在一个 store
后面很难保持清晰。
4. 只比库的优缺点,不先做状态分层
这通常会把真正问题看偏。
总结
React 状态管理选择真正要回答的,不是哪套库更潮,而是状态到底属于哪一层。Context 更适合稳定共享上下文,Redux 更适合约束性更强的团队协作场景,Zustand 更适合承接一部分轻量到中等复杂度的共享状态,而服务端状态则应该被单独看作远程数据协作问题。只要先把边界分清楚,工具选择就会简单很多。