Redux Cheatsheet - State Management

Redux Toolkit 状态管理必备 API 都在这里了,从 Store 配置到异步处理,按类别分类整理,写代码时直接复制。

Languages·37 commands·Last updated 2026-07-21
Back to Languages

Store 配置 5

const store = configureStore({ reducer: rootReducer })
RTK 创建 store
configureStore({ reducer: { users: usersReducer, posts: postsReducer } })
多 reducer 自动合并
configureStore({ middleware: (gdm) => gdm().concat(logger) })
追加自定义中间件
configureStore({ devTools: "prerender" !== "production" })
仅开发环境开启 devTools
const rootReducer = combineReducers({ users, posts })
手动合并多个 reducer

Slice 创建 6

const slice = createSlice({ name, initialState, reducers })
创建 slice
name: "counter"
slice 命名空间(自动作为 action 前缀)
initialState: { count: 0 }
slice 初始状态
reducers: { increment(state) { state.count += 1 } }
同步 reducer(Immer 自动不可变)
extraReducers: (builder) => builder.addCase(fulfilled, ...)
处理外部异步 action
export const { increment } = slice.actions
导出自动生成的 action creators

Actions 与 Dispatch 5

dispatch(increment())
dispatch 同步 action
dispatch(fetchUser(id))
dispatch 异步 thunk
const { increment } = counterSlice.actions
从 slice 获取 action creator
store.dispatch({ type: "counter/increment" })
直接 dispatch 原始 action 对象
export default slice.reducer
导出 reducer 给 store

异步处理 5

const fetchUser = createAsyncThunk("user/fetch", async (id) => {})
创建异步 thunk
builder.addCase(fetchUser.pending, (state) => {})
处理请求中状态
builder.addCase(fetchUser.fulfilled, (state, action) => {})
处理请求成功
builder.addCase(fetchUser.rejected, (state, action) => {})
处理请求失败
await dispatch(fetchUser(id)).unwrap()
获取成功结果或抛出错误

中间件 5

const logger = () => (next) => (action) => {}
自定义中间件签名(三层柯里化)
middleware: (gdm) => gdm().concat(customMiddleware)
保留默认中间件并追加
configureStore({ middleware: (gdm) => gdm({ serializableCheck: false }) })
配置默认中间件选项
import { thunk } from "redux-thunk"
redux-thunk 异步中间件(RTK 默认内置)
gdm({ immutableCheck: false, serializableCheck: false })
生产环境关闭检查以提升性能

选择器 5

useSelector((state) => state.counter.value)
从 store 读取状态
const dispatch = useDispatch()
获取 dispatch 函数
const selectCount = (state) => state.counter.value
定义选择器函数
const selectUserById = createSelector(...)
创建 memoized 选择器(reselect)
useSelector(selectUserById, shallowEqual)
浅比较避免不必要的重渲染

常用模式 6

<Provider store={store}><App /></Provider>
在根组件注入 store
state.entities[id]
规范化状态(按 id 存储实体)
createEntityAdapter({ selectId: (item) => item.id })
实体适配器管理集合
adapter.getSelectors((state) => state.items)
获取实体适配器选择器
adapter.upsertOne(state, item)
存在则更新,不存在则插入
import { createApi } from "@reduxjs/toolkit/query/react"
RTK Query 数据获取

💡 Tips

  • Redux 三大原则:单一数据源、状态只读、纯函数修改状态。
  • RTK 内置 Immer,可在 reducer 中直接"修改"状态,底层自动生成不可变更新。
  • useSelector 会在 store 更新时重新执行,返回新引用会触发重渲染,注意性能优化。
  • Redux Toolkit (RTK) 是官方推荐的方式,configureStore 和 createSlice 大幅简化样板代码。
  • createAsyncThunk 配合 extraReducers 处理异步,redux-thunk 已内置在 RTK 默认中间件中。