很喜欢 Jotai。优点:

  1. API 简单
  2. 性能卓越。

缺点:

  1. 状态(atom)多了后,散落在不同文件里,不好管理。
  2. 必须在 React 组件或 hooks 里用。

Zustand

各状态管理库对比

原文

框架原理优点缺点
hooks context基于 React Hook,开发者可实现内/外部存储1. 使用简单
2. 不需要引用第三方库,体积最小
3. 支持存储全局状态,但在复杂应用中不推荐
4. 不依赖 React 上下文,可在组件外调用(外部存储的条件下)
1. Context value 发生变化时,所有用到这个 Context 的组件都会被重新渲染,基于 Context 维护的模块越多,影响范围越大。
2. 依赖 Context Provider 包裹应用,修改 store 无法在应用最顶层 (App.tsx 层级) 触发渲染
3. 受 UI 框架约束 (React)
4. 依赖 Hooks 调用
react-reduxFlux 思想,发布订阅模式,遵从函数式编程,外部存储1. 不依赖 React 上下文,可在组件外调用
2. 支持存储全局状态
3. Redux 本身是一种通用的状态解决方案
1. 心智模型需要时间理解,特别是当你不熟悉函数式编程时
2. 依赖 Context Provider 包裹应用,修改 store 无法在应用最顶层 (App.tsx 层级) 触发渲染
3. 受 UI 框架约束 (React)
mobx观察者模式 + 数据劫持,外部存储1. 使用简单,上手门槛低
2. 不依赖 React 上下文,可在组件外调用
3. 支持存储全局状态
4. 通用的状态解决方案
1. 可变状态模型,某些情况下可能影响调试
2. 体积相对较大,3.99M
zustandFlux 思想,观察者模式,外部存储1. 轻量,使用简单,上手门槛低
2. 不依赖 React 上下文,可在组件外调用
3. 支持存储全局状态
4. 通用的状态解决方案
1. 框架本身不支持 computed 属性,但可基于 middleware 机制通过少量代码间接实现 computed,或基于第三方库 zustand-computed 实现
jotai基于 React Hook,内部存储1. 使用简单
2. 组件颗粒度较细的情况下,Jotai 性能更好
3. 支持存储全局状态
1. 依赖 React 上下文,无法在组件外调用,相对而言,Zustand 在 React 环境外及全局可以更好地工作
2. 受 UI 框架约束 (React)
recoil进阶版 Jotai,基于 React Hook + Provider Context,内部存储相对于 Jotai 而言,会更重一些,但思想基本不变,拥有一些 Jotai 未支持的特性及 API,如:
1. 监听 store 变化
2. 针对 atom 的操作拥有更多的 API,编程上拥有更多的可能性,更加有趣
拥有 Jotai 所有的缺点,且相对于 Jotai 而言:
1. 使用 Recoil 需要 <RecoilRoot> 包裹应用程序
2. 编写 selector 会更复杂
valtio基于数据劫持,外部存储1. 使用简单,类 MobX(类 Vue)的编程体验
2. 支持存储全局状态
3. 不依赖 React 上下文,可在组件外调用
4. 通用的状态解决方案
1. 可变状态模型,某些情况下可能影响调试
2. 目前未发现其它特别大的缺点,个人猜测 Star 相对 Zustand 较少,可能是因为 Valtio 的数据双向绑定思想与 React 存在冲突