diff --git a/source/_posts/2023-02-15-React-State-Management-comparison.md b/source/_posts/2023-02-15-React-State-Management-comparison.md
new file mode 100644
index 0000000000..a808d55988
--- /dev/null
+++ b/source/_posts/2023-02-15-React-State-Management-comparison.md
@@ -0,0 +1,168 @@
+title: React 状态管理工具如何选 context/redux/mobx/zustand/jotai/recoil/valtio ?
+subtitle: 众所周知,我们在研发一个`复杂应用`的过程中,一套好的`状态管理方案`是必不可少的,既能`提升研发效率,又能降低研发维护成本`,那么状态管理方案那么多,它们有什么不同,我们又该`如何选择`适合当前应用的方案呢?
+cover: https://img12.360buyimg.com/img/s1812x1096_jfs/t1/54360/14/23827/2137537/63eca4d7F496ff02f/5d826e331ab4bd3b.png
+category: 经验分享
+tags:
+ - ReactJS
+ - State-Management
+author:
+ nick: 阿文
+ github_name: AwesomeDevin
+date: 2023-2-15 21:00:00
+wechat:
+ share_cover: https://img12.360buyimg.com/img/s1812x1096_jfs/t1/54360/14/23827/2137537/63eca4d7F496ff02f/5d826e331ab4bd3b.pn
+ share_title: React 状态管理工具如何选 context/redux/mobx/zustand/jotai/recoil/valtio ?
+ share_desc: 众所周知,我们在研发一个`复杂应用`的过程中,一套好的`状态管理方案`是必不可少的,既能`提升研发效率,又能降低研发维护成本`,那么状态管理方案那么多,它们有什么不同,我们又该`如何选择`适合当前应用的方案呢?
+---
+
+### 什么是状态管理?
+**“状态”是描述应用程序当前行为的任何数据**。这可能包括诸如“从服务器获取的对象列表”、“当前选择的项目”、“当前登录用户的名称”和“此模式是否打开?”等值。
+
+众所周知,我们在研发一个`复杂应用`的过程中,一套好的`状态管理方案`是必不可少的,既能`提升研发效率,又能降低研发维护成本`,那么状态管理方案那么多,它们有什么不同,我们又该`如何选择`适合当前应用的方案呢?
+
+本期将主要就 `react` 的常用状态管理方案进行对比分析,希望对各位看客有帮助。
+
+### React 状态管理方案
+##### 方案介绍
+- **[hooks context](https://reactjs.org/docs/hooks-reference.html#usecontext)**
+- **[react-redux](https://react-redux.js.org/)**
+- **[mobx](https://mobx.js.org/README.html)**
+- **[zustand](https://awesomedevin.github.io/zustand-vue/)**
+- **[jotai](https://jotai.org/)**
+- **[recoil](https://recoiljs.org/)**
+- **[valtio](https://valtio.pmnd.rs/)**
+
+##### 方案对比
+框架 | 原理 | 优点 | 缺点
+--- | --- | --- | ---
+hooks context | 基于 react hook,开发者可实现内/外部存储 | 1. 使用简单
2. 不需要引用第三方库,体积最小
3. 支持存储全局状态,但在复杂应用中不推荐
4. 不依赖 react 上下文,可在组件外调用(外部存储的条件下) | 1. context value发生变化时,所有用到这个context的组件都会被重新渲染,基于 content 维护的模块越多,影响范围越大。
2.依赖 Context Provider 包裹你的应用程序,修改 store 无法在应用最顶层(App.tsx 层级)触发渲染
3. 受ui框架约束(react)
4. 依赖hooks调用
+react-redux | Flux思想,发布订阅模式,遵从函数式编程,外部存储 | 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
+zustand | Flux思想,观察者模式,外部存储 | 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 存在冲突。
+
+### Source
+- hooks context
+ [1.使用 react hooks + context 进行方便快捷的状态管理](https://github.com/AwesomeDevin/blog/issues/79)
+ [2.使用 react hooks + context 构建 redux 进行状态管理](https://github.com/AwesomeDevin/blog/issues/45)
+- [react-redux](https://codesandbox.io/s/github/reduxjs/redux-essentials-counter-example/tree/master/?from-embed=&file=/src/features/counter/counterSlice.js)
+- mobx
+```js
+import React from "react"
+import ReactDOM from "react-dom"
+import { makeAutoObservable } from "mobx"
+import { observer } from "mobx-react"
+
+// 状态及相关事件
+class Timer {
+ secondsPassed = 0
+
+ constructor() {
+ makeAutoObservable(this)
+ }
+
+ increase() {
+ this.secondsPassed += 1
+ }
+
+ reset() {
+ this.secondsPassed = 0
+ }
+}
+
+const myTimer = new Timer()
+
+// 构建可观擦组件
+const TimerView = observer(({ timer }) => (
+
+))
+
+ReactDOM.render(