React 状态管理库

87 阅读4分钟

名词

单一数据源:整个应用的状态存储在一个统一的对象树中,而不是分散在各个组件或模块里。

不可变状态:指你不能直接修改状态的值,而是需要创建一个新的值来替换旧的状态。

纯函数

  • 无状态:不依赖外部状态的变化,相同输入总是产生相同输出。
  • 无副作用:在执行过程中不影响外部状态,只依赖于输入参数并返回输出结果。

响应式编程:一种基于数据流变化自动传播和响应的编程范式,核心思想是声明式地定义数据之间的关系,当数据变化时,依赖它的逻辑会自动更新(类似 Excel 公式)。

原子化状态

  • Atoms (原子状态):可被多个组件订阅的最小状态单位,类似于 React 的局部组件状态,但可以在多个组件间共享
  • Selectors (选择器):派生状态,可以从 atoms 或其他 selectors 计算得出

1. Redux

特点:单一数据源、不可变状态、纯函数更新
优点

  • 严格的架构,适合超大型应用(如企业级后台)。
  • 强大的中间件生态(如 Redux-Thunk、Redux-Saga)。
  • 完备的调试工具(Redux DevTools)。

缺点

  • 模板代码多,开发效率低。
  • 学习曲线陡峭(中间件、不可变性处理)。
  • 性能问题:全局状态更新可能触发无关组件重渲染。
  • 更多的内存占用。由于采用单一数据源,所有状态存储在一个state中,当某些状态不再需要使用时,也不会被垃圾回收释放内存

适用场景:复杂状态逻辑、需要时间旅行调试或严格状态追溯的项目。


2. MobX

特点:响应式编程、自动依赖追踪、可变状态
优点

  • 代码简洁,类似 Vue 的响应式体验。
  • 高性能:精确更新依赖变化的组件。

缺点

  • 状态可变性导致调试困难(难以追踪变化来源)。
  • 过度灵活易引发代码混乱。

适用场景:中小型应用,追求开发效率且接受可变状态的团队。


3. Recoil

特点:原子化状态、依赖图更新
优点

  • 原生 Hooks 风格,无模板代码。
  • 细粒度更新,只依赖特定 atom 或 selector 的组件才会重新渲染。
  • 支持并发模式(React 18+)。

缺点

  • 仍处于实验性阶段(Facebook 官方未标记为稳定)。
  • 需要为每个状态定义唯一 key
  • 最后一次更新为2023年,在25年1月2号,git仓库已被设置为只读

适用场景:需要细粒度控制渲染的复杂应用(如大型表单、数据看板)。


4. Jotai

特点:Recoil 的极简版、无 Key 设计
优点

  • 比 Recoil 更轻量,无 keyProvider 负担。

缺点

  • 社区生态较小。

适用场景:喜欢 Recoil 但希望更简单的项目。


5. Zustand

特点:轻量级 Redux 替代、多 Store 支持
优点

  • 无模板代码,API 极简。
  • 更灵活:不需要单一的全局 store,可以创建多个 store
  • 更轻量:包体积更小,概念更少
  • 支持中间件(持久化、日志等)。
  • 性能优异(自动选择依赖更新)。

缺点

  • 缺乏内置计算属性(需手动实现或第三方扩展)。

适用场景:大多数项目(Redux 的平替,平衡简洁与功能)。


6. Hox

特点:基于 Hooks 的轻量级方案
优点

  • API 简单(createModel + useModel)。
  • 无 Provider 嵌套问题。

缺点

  • 调试工具弱,不适合超大型应用。
  • 依赖 Hooks

适用场景:中小型应用,快速共享 Hook 状态。


7. Dva

特点:Redux + Redux-Saga + Router 集成
优点

  • 仅有6个API,开箱即用,减少配置成本。

缺点

  • 已停止维护,不推荐新项目使用。

选型建议

需求场景推荐库理由
大型复杂应用,强调试需求Redux严格的架构和工具链支持
中小型应用,追求开发效率Zustand / MobX简洁 API,高性能
需要细粒度渲染控制Recoil / Jotai原子化状态,精准更新
快速共享 Hook 状态Hox无 Provider,极简集成
新项目,平衡功能与简洁ZustandRedux 的现代替代,生态良好

趋势

  • Zustand 逐渐成为 Redux 的替代首选(简化设计 + 良好性能)。
  • 原子化状态库(Recoil/Jotai)在复杂交互场景中表现优异。
  • Hox 适合 Hooks 优先的小型项目。