全局状态管理器
1. Context API
1.1 核心概念
通过Provider + useContext实现全局状态管理
useContext:用来在组件树中共享数据,避免多层 props 传递。useReducer:用来管理复杂的状态逻辑(类似 Redux 的 reducer 思路)。
组合起来,你就能实现一个 小型 Redux,但更轻量,代码量也少。是一个局部可控的状态中心
Context(上下文对象)
作用:存储你希望在组件树中共享的状态或数据。
特点:
defaultValue是当组件树上层没有 Provider 时使用的默认值。Context 本身只是一个容器,不管理状态的更新。
Provider(提供者)
作用:将状态传递给子孙组件。
特点:
value是共享的数据或状态。Provider 可以嵌套,每个 Provider 都会覆盖上层 Provider 的值。
Consumer(消费者)
作用:在组件中获取 Context 的值。
特点:
函数子组件接收当前 Context 的值。
现代 React 更常用
useContextHook 替代 Consumer。
useContext Hook
作用:在函数组件中直接获取 Context 值。
特点:
简化了 Consumer 的写法
当 Provider 的
value改变时,订阅该 Context 的组件会重新渲染
更新 Context 数据
Context 本身不提供修改方法,通常结合 useState 或 useReducer 使用
特点
- 子组件可以通过
useContext(MyContext)调用setUser更新状态。
1.2 数据流
1、创建 Context。
2、Provider 提供状态
3、子组件订阅 Context
4、子组件更新状态(可选)
5、Provider 更新 value
1.3 使用示例
想要使用useContext,首先要创建context。使用createContext,通过Provider提供数据,然后在子组件中调用useContext消费数据。
1 | // 1. 创建 Context |
1.4 项目使用实例
全局认证信息管理
通过 Context 把认证信息(如 token、用户信息)注入整个组件树,使任意子组件都可以访问或更新
1、创建context
1 | //1、创建Context |
2、定义reduce
定义不同的动作,根据不同的 动作,返回一个新的 state。
1 | /** |
3、在父组件中提供状态
1 | const StoreProviderContext: FC<RenderType> = (props) => { |
4、在子组件使用
1 | import { MessageInstance } from '@/context/Message'; |
在app.tsx中定义provider,那么其所有的子组件都可以共享组件状态。
特点:
使用 useReducer 管理应用级状态
管理用户设备信息、认证状态等
提供 appStore 和 appDispatch 给子组件
将元数据管理修改为useContext+useRedux组成的全局状态管理
1、首先需要定义State和Action
State是全局状态组件中的所有数据
Action是全局状态组件中的所有操作
1 | interface State { |
2、接着定义reducer
1 | const reducer = (state: State, action: Action): State => { |
3、初始化state状态
1 | const initialState: State = { |
4、调用createContext创建上下文
1 | const DataContext = createContext< |
5、定义redux仓库
1 | export const useDataStore = () => { |
6、定义provider方法
1 | // Provider组件 |
7、在入口函数中使用DataProvider组件包裹组件
1 | export default function DataNesting(props: { productType: string; selectedProduct: ProductList }) { |
8、在需要的地方调用仓库
1 | const { state, dispatch, getTreeData, getMoudleList } = useDataStore(); |
2. Redux
Redux 是一个 JavaScript 状态管理库,最常用于 React 应用,但也可以搭配 Vue、Angular 或者原生 JS 使用。它的核心思想是:
👉 单一数据源、状态只读、用纯函数来更新状态。
2.1 核心概念
Store(存储)
Action(动作)
Reducer(状态更新函数)
Dispatch(派发)
Subscribe(订阅)
2.2 数据流
Redux 强调 单向数据流:
用户操作触发 dispatch(action)
Reducer 根据 action 生成新的 state
Store 保存新的 state
视图(UI)重新渲染
⚠️注意
2.3 使用实例
1、安装包依赖
1 | pnpm add @reduxjs/toolkit react-redux |
2、创建目录
src/reduxstore/
├── index.ts # 主 store 配置
├── hooks.ts # 类型化的 Redux hooks
├── dataNestHooks.ts # 业务相关的 hooks
└── slices/
└── dataNestSlice.ts # 具体的 slice 实现
3、创建Redux Store配置
1 | import { configureStore } from '@reduxjs/toolkit'; |
4、创建类型化的钩子
1 | import { useDispatch, useSelector, TypedUseSelectorHook } from 'react-redux'; |
说明:
创建类型化的 useDispatch 和 useSelector hooks
确保类型安全,避免在组件中使用时出现类型错误
5、创建Redux Slice
首先定义状态类型和初始状态
1 | export interface DataNestState { |
接着创建异步的thunk函数
1 | export const getProductList = createAsyncThunk('dataNest/getProductList', async () => { |
说明:
createAsyncThunk:创建异步 action
自动处理 pending、fulfilled、rejected 状态
返回 Promise,便于在组件中使用
创建slice
1 | const dataNestSlice = createSlice({ |
关键点:
reducers:定义同步 actions
extraReducers:处理异步 thunk 的状态变化
使用 Immer,可以直接修改 state
6、创建业务hook
1 | export const useDataNestStore = () => { |
说明:
封装 Redux 的复杂性
提供与原有 API 兼容的接口
便于组件使用
7、配置provider
1 | import { Provider } from 'react-redux'; |
8、调用store
1 | const { selectedProduct, loading } = useDataNestStore(); |
3. Zustand
3.1 核心概念
Zustand 是一个 轻量级 React 状态管理库,由 Jotai 和 React-spring 的作者开发。可以有多个store,为不同的业务定义不同的store仓库。
State(状态)
概念:store 中保存的数据就是 state,可以是对象、数组、基本类型等。
特点:
状态是响应式的,订阅它的组件会在状态改变时重新渲染。
状态更新不需要 reducer 或 action,直接调用更新函数即可。
Actions / 更新函数
概念:store 中定义的函数,用来修改状态。
特点:
可以直接修改状态(用
set或get)。可以写成复杂逻辑,包括异步请求。
Selectors / 选择性订阅
概念:组件可以订阅 store 中的部分状态,而不是整个 store。
作用:优化性能,避免状态更新导致不相关组件重新渲染。
中间件(Middleware,可选)
- 概念:增强 store 功能,比如持久化、日志记录、调试等。
3.2 数据流
创建 Store
- 用
create()定义状态和更新函数(actions)。
- 用
组件订阅状态(Selector)
- 组件通过
useStore(state => state.someValue)订阅 store 的部分状态。
- 组件通过
组件调用 Actions 更新状态
- 调用 store 内定义的函数(例如
increment()、setUser())来修改状态。
- 调用 store 内定义的函数(例如
Store 更新状态
通过定义的dispatch函数更新 store 的状态,同时触发所有订阅了该状态的组件重新渲染。
组件接收最新状态重新渲染
3.3 使用实例
1、定义数据类型及执行的操作
1 | export type DataNestState = { |
2、创建store仓库
使用create函数
1 | /** |
3、定义dispatch触发状态变更。
1 | /** |
4、调用store中的方法及参数
1 | const { selectedProduct, getMoudleList, loading, dispatch } = useDataNestStore(); |
5、调用dispatch函数更新状态,调用store中的方法更新状态
1 | dispatch({ loading: true }); |
4. 全局状态管理器对比
4.1 useContext + useReducer
定位:React 内置的“轻量级状态管理”,适合小规模应用或局部状态共享。
特点:
useReducer负责处理 state 和 action(类似 Redux reducer)。useContext负责跨组件传递 state 和 dispatch。状态保存在 React 组件树中,每次更新都会触发 相关 Provider 下所有子组件的重新渲染(除非配合
memo/useMemo优化)。
适用场景:小项目,局部共享状态(如主题、登录信息),对全局性能要求不高时。
4.2 Zustand
定位:现代化、极简的 React 状态管理库。
特点:
没有样板代码,直接定义一个“store 函数”,很像写普通 JS 对象。
不依赖 React Context,所以避免了“Provider 大爆炸”和无关组件渲染。
支持选择性订阅(
useStore(state => state.xxx)),只有依赖的数据变了,组件才会更新。内置中间件支持(持久化、日志、immer 等),使用体验很灵活。
适用场景:中小型到中大型项目,需要比 Redux 更少模板代码,同时关注性能和易用性。
4.3 Redux
定位:老牌状态管理框架,适合大型应用。
特点:
单一数据源(一个 Store),数据流严格单向。
强约束:必须通过 Action → Reducer → 新 State 的流程,方便调试和回溯。
生态庞大:Redux Toolkit 简化了很多样板代码,DevTools 支持强大。
但是:代码量偏多,学习曲线高于 Zustand/useReducer。
适用场景:大型复杂项目,需要严格的状态管理规范、调试工具和团队协作时。
