aurora blog
  • JS

    • 基本汇总
    • Date时间
    • Array方法
    • String 方法
    • Object方法
    • RegExp正则
    • Es6 新特性等
    • Event-Loop
    • Http and Https
    • for in和for of区别
    • Web Worker
    • Promise && async
    • 堆内存 & 栈内存
    • JS设计模式探索
    • npm & yarn
    • Fetch和Axios的区别
    • 学习及面试问题整理
    • URL 输入到页面加载过程
    • 跨域&nginx本地项目代理
  • FE框架

    • react

      • 基本用法
      • react生命周期
      • hooks 16.8版本后
      • Route原理
      • Redux源码解析
      • React16 Fiber
      • React-VirtualDOM
      • React事件委托机制
      • React性能优化
      • 状态管理方案对比
      • React 18新特性
    • vue

      • vue 基本用法
      • vue 生命周期
      • VirtualDOM
      • vue 事件委托
      • vue 架构
      • vue 状态管理
      • 问题等
    • React-Native

      • React-Native 基本用法
    • 微前端

      • 遇到的问题
    • 鸿蒙 harmony

      • harmony 基础
  • 构建工具

    • webpack

      • Webpack配置详解
      • Webpack的使用
      • Babel-polyfill
      • webpack面试题
    • vite

      • vite配置详解
      • vite面试题
    • rollup

      • Rollup配置详解
      • rollup面试题
    • 构建工具对比
  • 性能优化

    • 性能优化策略
    • 缓存策略
    • 性能优化面试题
  • 浏览器

    • 浏览器渲染原理
    • 浏览器缓存机制
    • 浏览器面试题
  • 工程化

    • 代码规范
    • 工程化面试题
  • 前端安全

    • XSS 攻击与防护
    • CSRF 攻击与防护
    • 前端安全面试题
  • 移动端开发

    • 移动端适配
    • 移动端开发面试题
  • 前端监控

    • 错误监控
    • 性能监控
    • 前端监控面试题
  • Typescript

    • Typescript详解
  • Servers

    • Nodejs
    • Nginx
  • Git命令

    • git常用规范
  • 数据库

    • mongodb
    • mongodb
  • Other

    • Jenkins自动化部署

React 状态管理方案对比

  • 状态管理概述
  • 方案对比
    • 1. Context API
    • 2. Redux
    • 3. MobX
    • 4. Zustand
    • 5. Jotai
    • 6. Recoil
    • 7. useReducer + Context
  • 对比表格
  • 选型建议
    • 1. 小型项目
    • 2. 中型项目
    • 3. 大型项目
    • 4. 需要响应式
    • 5. 不想引入库
  • 最佳实践
    • 1. 状态管理原则
    • 2. 性能优化
    • 3. 代码组织
  • 总结

状态管理概述

React 应用的状态管理有多种方案,选择合适的方案对项目至关重要。本文对比主流的状态管理方案。

方案对比

1. Context API

简介: React 内置的状态管理方案

特点:

  • ✅ 无需安装额外库
  • ✅ 简单易用
  • ✅ 适合简单场景
  • ❌ 性能问题(值变化导致所有消费者重新渲染)
  • ❌ 不适合复杂状态管理

使用:

import { createContext, useContext, useState } from 'react';

const CountContext = createContext();

function CountProvider({ children }) {
  const [count, setCount] = useState(0);
  
  return (
    <CountContext.Provider value={{ count, setCount }}>
      {children}
    </CountContext.Provider>
  );
}

function Counter() {
  const { count, setCount } = useContext(CountContext);
  
  return (
    <div>
      <p>{count}</p>
      <button onClick={() => setCount(count + 1)}>+</button>
    </div>
  );
}

适用场景:

  • 简单的全局状态
  • 主题、语言等配置
  • 小到中型项目

2. Redux

简介: 最流行的状态管理库,基于 Flux 架构

特点:

  • ✅ 可预测的状态管理
  • ✅ 强大的中间件生态
  • ✅ 时间旅行调试
  • ✅ 适合大型应用
  • ❌ 样板代码多
  • ❌ 学习曲线陡峭
  • ❌ 配置复杂

使用:

// store.js
import { createStore } from 'redux';

const initialState = { count: 0 };

function reducer(state = initialState, action) {
  switch (action.type) {
    case 'INCREMENT':
      return { ...state, count: state.count + 1 };
    case 'DECREMENT':
      return { ...state, count: state.count - 1 };
    default:
      return state;
  }
}

const store = createStore(reducer);

// Component.jsx
import { useSelector, useDispatch } from 'react-redux';

function Counter() {
  const count = useSelector(state => state.count);
  const dispatch = useDispatch();
  
  return (
    <div>
      <p>{count}</p>
      <button onClick={() => dispatch({ type: 'INCREMENT' })}>+</button>
    </div>
  );
}

Redux Toolkit(推荐):

import { createSlice, configureStore } from '@reduxjs/toolkit';

const counterSlice = createSlice({
  name: 'counter',
  initialState: { value: 0 },
  reducers: {
    increment: (state) => {
      state.value += 1;
    },
    decrement: (state) => {
      state.value -= 1;
    },
  },
});

export const { increment, decrement } = counterSlice.actions;

const store = configureStore({
  reducer: {
    counter: counterSlice.reducer,
  },
});

适用场景:

  • 大型应用
  • 复杂的状态逻辑
  • 需要时间旅行调试
  • 团队熟悉 Redux

3. MobX

简介: 响应式状态管理库

特点:

  • ✅ 响应式,自动更新
  • ✅ 代码简洁
  • ✅ 学习曲线平缓
  • ✅ 性能好
  • ❌ 不够函数式
  • ❌ 调试困难
  • ❌ 魔法较多

使用:

import { makeAutoObservable } from 'mobx';
import { observer } from 'mobx-react-lite';

class CounterStore {
  count = 0;
  
  constructor() {
    makeAutoObservable(this);
  }
  
  increment() {
    this.count++;
  }
  
  decrement() {
    this.count--;
  }
}

const counterStore = new CounterStore();

const Counter = observer(() => {
  return (
    <div>
      <p>{counterStore.count}</p>
      <button onClick={() => counterStore.increment()}>+</button>
      <button onClick={() => counterStore.decrement()}>-</button>
    </div>
  );
});

适用场景:

  • 需要响应式更新
  • 面向对象编程风格
  • 中小型项目

4. Zustand

简介: 轻量级状态管理库

特点:

  • ✅ 极简 API
  • ✅ 体积小(< 1KB)
  • ✅ 无需 Provider
  • ✅ TypeScript 友好
  • ✅ 性能好
  • ❌ 生态相对较小
  • ❌ 不适合超大型应用

使用:

import create from 'zustand';

const useStore = create((set) => ({
  count: 0,
  increment: () => set((state) => ({ count: state.count + 1 })),
  decrement: () => set((state) => ({ count: state.count - 1 })),
}));

function Counter() {
  const { count, increment, decrement } = useStore();
  
  return (
    <div>
      <p>{count}</p>
      <button onClick={increment}>+</button>
      <button onClick={decrement}>-</button>
    </div>
  );
}

适用场景:

  • 中小型项目
  • 需要简单状态管理
  • 追求轻量级
  • 快速开发

5. Jotai

简介: 原子化状态管理库

特点:

  • ✅ 原子化设计
  • ✅ 细粒度更新
  • ✅ 性能优秀
  • ✅ TypeScript 友好
  • ✅ 组合性强
  • ❌ 学习曲线
  • ❌ 生态较小

使用:

import { atom, useAtom } from 'jotai';

const countAtom = atom(0);

function Counter() {
  const [count, setCount] = useAtom(countAtom);
  
  return (
    <div>
      <p>{count}</p>
      <button onClick={() => setCount(count + 1)}>+</button>
      <button onClick={() => setCount(count - 1)}>-</button>
    </div>
  );
}

// 派生状态
const doubleCountAtom = atom((get) => get(countAtom) * 2);

适用场景:

  • 需要细粒度更新
  • 复杂的状态依赖
  • 性能要求高
  • 喜欢函数式编程

6. Recoil

简介: Facebook 官方状态管理库

特点:

  • ✅ Facebook 官方
  • ✅ 原子化设计
  • ✅ 细粒度更新
  • ✅ 异步支持好
  • ❌ 仍处于实验阶段
  • ❌ 文档不够完善
  • ❌ 生态较小

使用:

import { RecoilRoot, atom, useRecoilState } from 'recoil';

const countState = atom({
  key: 'countState',
  default: 0,
});

function Counter() {
  const [count, setCount] = useRecoilState(countState);
  
  return (
    <div>
      <p>{count}</p>
      <button onClick={() => setCount(count + 1)}>+</button>
    </div>
  );
}

function App() {
  return (
    <RecoilRoot>
      <Counter />
    </RecoilRoot>
  );
}

适用场景:

  • Facebook 技术栈
  • 需要异步状态管理
  • 实验性项目

7. useReducer + Context

简介: React Hooks 组合方案

特点:

  • ✅ 无需额外库
  • ✅ 适合复杂状态逻辑
  • ✅ 可预测
  • ❌ 需要手动优化
  • ❌ 样板代码多

使用:

import { createContext, useContext, useReducer } from 'react';

const CountContext = createContext();

function countReducer(state, action) {
  switch (action.type) {
    case 'increment':
      return { count: state.count + 1 };
    case 'decrement':
      return { count: state.count - 1 };
    default:
      return state;
  }
}

function CountProvider({ children }) {
  const [state, dispatch] = useReducer(countReducer, { count: 0 });
  
  return (
    <CountContext.Provider value={{ state, dispatch }}>
      {children}
    </CountContext.Provider>
  );
}

function Counter() {
  const { state, dispatch } = useContext(CountContext);
  
  return (
    <div>
      <p>{state.count}</p>
      <button onClick={() => dispatch({ type: 'increment' })}>+</button>
    </div>
  );
}

适用场景:

  • 不想引入额外库
  • 复杂的状态逻辑
  • 中小型项目

对比表格

方案体积学习曲线性能适用场景推荐度
Context API0KB⭐ 简单⭐⭐简单全局状态⭐⭐⭐
Redux~15KB⭐⭐⭐⭐ 陡峭⭐⭐⭐⭐大型应用⭐⭐⭐⭐
Redux Toolkit~20KB⭐⭐⭐ 中等⭐⭐⭐⭐大型应用⭐⭐⭐⭐⭐
MobX~15KB⭐⭐ 平缓⭐⭐⭐⭐⭐响应式需求⭐⭐⭐
Zustand<1KB⭐ 简单⭐⭐⭐⭐中小型项目⭐⭐⭐⭐⭐
Jotai~5KB⭐⭐⭐ 中等⭐⭐⭐⭐⭐细粒度更新⭐⭐⭐⭐
Recoil~15KB⭐⭐⭐ 中等⭐⭐⭐⭐实验性项目⭐⭐⭐
useReducer0KB⭐⭐ 中等⭐⭐⭐复杂逻辑⭐⭐⭐

选型建议

1. 小型项目

推荐: Context API 或 Zustand

  • 简单直接
  • 无需复杂配置
  • 快速开发

2. 中型项目

推荐: Zustand 或 Jotai

  • 平衡功能和复杂度
  • 性能好
  • 易于维护

3. 大型项目

推荐: Redux Toolkit 或 Jotai

  • 可扩展性强
  • 工具链完善
  • 团队协作好

4. 需要响应式

推荐: MobX

  • 自动更新
  • 代码简洁

5. 不想引入库

推荐: useReducer + Context

  • 零依赖
  • 完全控制

最佳实践

1. 状态管理原则

  • 最小化状态:只存储必要的状态
  • 状态提升:共享状态提升到公共祖先
  • 状态降级:局部状态保持在组件内部
  • 单一数据源:避免状态重复

2. 性能优化

  • 使用选择器(selector)避免不必要的更新
  • 分离 Context 减少重新渲染
  • 使用 useMemo 和 useCallback
  • 合理使用 React.memo

3. 代码组织

  • 按功能模块组织状态
  • 统一的状态更新方式
  • 清晰的命名规范
  • 完善的类型定义

总结

选择建议:

  1. 简单项目:Context API
  2. 中小型项目:Zustand(推荐)
  3. 大型项目:Redux Toolkit
  4. 需要细粒度更新:Jotai
  5. 响应式需求:MobX
  6. 不想引入库:useReducer + Context

趋势:

  • Zustand 和 Jotai 越来越受欢迎
  • Redux Toolkit 简化了 Redux 使用
  • 原子化状态管理是趋势
  • 轻量级方案更受青睐
最近更新:: 2025/11/20 14:50
Contributors: liyulai
Prev
React性能优化
Next
React 18新特性