当组件之间状态通信越来越复杂时,靠 props 和事件传递会变得非常难维护。状态管理工具提供:
目标 | 实现方式 |
---|---|
状态集中管理 | 将状态集中存放,避免组件深层传递 |
状态可预测、可追踪 | 有清晰的流转逻辑(Action → Reducer → Store) |
跨组件通信 | 无需 props drilling(逐层传递) |
支持模块拆分与中间件 | 支持插件化、按模块加载、异步处理 |
Component → dispatch(Action)
↓
Reducer(state, action)
↓
New State → 组件更新
// actions.ts
const INCREMENT = 'INCREMENT'
// reducer.ts
function counter(state = 0, action) {
switch (action.type) {
case INCREMENT:
return state + 1
default:
return state
}
}
// 组件中
const count = useSelector(state => state.counter)
const dispatch = useDispatch()
<button onClick={() => dispatch({ type: 'INCREMENT' })}>+</button>
@reduxjs/toolkit
: 官方推荐,支持简化 reducer + 异步逻辑;redux-thunk
/ redux-saga
: 中间件处理异步;react-redux
: 将 Redux 绑定 React 组件;createSlice
: 模块化组织 reducer、actions;Redux 是如何保证不可变性的?为什么推荐使用 Redux Toolkit?
答:原生 reducer 需要手动拷贝,易错;RTK 使用 Immer
自动转代理对象,确保不可变性 + 简化代码逻辑。
Pinia 是 Vue 3 的官方状态管理方案,替代 Vuex,支持组合式 API,更轻量。
// store/counter.ts
export const useCounter = defineStore('counter', {
state: () => ({ count: 0 }),
actions: {
increment() {
this.count++
}
}
})
<script setup>
const counter = useCounter()
</script>
<template>
<button @click="counter.increment">+</button>
</template>
特性 | Vuex | Pinia |
---|---|---|
语法方式 | Options API | Composition API |
模块化支持 | 嵌套 modules | 直接创建多个 store |
类型推导 | 手动配置 | 内置支持 |
Devtools 支持 | ✅ | ✅ |
状态持久化 | 插件支持 | 插件更方便 |
pinia-plugin-persistedstate
: 实现 localStorage 自动持久化;storeToRefs()
: 解构 store 保持响应性;const { count } = storeToRefs(useCounter())
“Minimal, scalable state management for React”
// store.ts
import { create } from 'zustand'
const useCounter = create(set => ({
count: 0,
inc: () => set(state => ({ count: state.count + 1 }))
}))
const { count, inc } = useCounter()
<button onClick={inc}>Count: {count}</button>
useStore(state => state.xxx)
),避免无谓渲染;特性 | Redux | Pinia | Zustand |
---|---|---|---|
框架绑定 | React | Vue | React |
状态结构 | 全局统一 store | 多个独立 store | 多 store,函数式组合 |
类型推导 | 强,RTK 更友好 | 内置强类型推导 | 基于泛型,可显式定义 |
中间件支持 | 丰富(Thunk/Saga) | 插件机制 | 内置中间件机制(devtool、persist) |
学习曲线 | 较陡 | 简洁易上手 | 极简 |
异步支持 | 中间件控制 | action 内直接使用 async | 任意方式皆可 |
状态要“分层”管理:
保持 Store 的最小性:
设计响应式、持久化、模块化:
persist
插件保存到 localStorage;添加开发支持:
前端状态管理并非“全局变量工具”,它是一套组织复杂交互状态的哲学。Redux 强在可预测性与插件生态,Pinia 赢在 Vue3 原生集成与开发体验,Zustand 则轻量灵活非常适合中小 React 项目。
掌握它们不仅让你能写好组件,更能写好系统。