本文档涵盖了 Redux 的核心扩展机制:中间件和 store 增强器。两者都允许您自定义 Redux 的行为,但在架构中扮演着不同的角色。中间件在分发的 action 到达 reducer 之前对其进行拦截,而增强器则修改 store 本身。有关在 TypeScript 中使用它们的更多信息,请参阅TypeScript 集成。
中间件和增强器是扩展 Redux 功能超出其核心能力的主要方式。它们使 Redux 能够处理副作用、异步操作、日志记录以及其他不属于 Redux 核心状态管理模型的功能。
Sources: docs/api/applyMiddleware.md12-30 docs/api/Store.md56-61 docs/faq/DesignDecisions.md67-71
中间件提供了一个第三方扩展点,位于 action 被分发与它到达 reducer 之间。它在 store 的 dispatch 方法周围形成一个管道,允许您在 action 被分发时添加自定义行为。
中间件特别适用于
Sources: docs/api/applyMiddleware.md12-23 docs/usage/side-effects-approaches.mdx34-42
中间件签名使用柯里化来创建函数管道。这种设计允许中间件包装 dispatch 方法,并访问 store 和链中的下一个中间件。
中间件具有此签名
Sources: docs/api/applyMiddleware.md30-31 docs/faq/DesignDecisions.md67-115
next 与 dispatch 的区别在中间件函数中
next 指的是链中的下一个中间件(如果是最后一个中间件,则指实际的 store.dispatch)dispatch 指的是 store 的 dispatch 方法,它会再次从中间件链的开头开始处理 action当您想在中间件内部分发新的 action 时,这个区别很重要
next(someNewAction) 会绕过所有之前的中间件dispatch(someNewAction) 会使 action 通过整个中间件管道Sources: docs/faq/StoreSetup.md16-17 docs/faq/DesignDecisions.md118-157
applyMiddleware 结合使用从旧版 Redux 迁移指南:applyMiddleware 函数是将中间件添加到 Redux store 的方式。它是一个 store 增强器,允许您将多个中间件函数组合在一起。
在现代 Redux 应用程序中(使用 Redux Toolkit),中间件是使用 configureStore 函数配置的,该函数会自动设置常用中间件。
Sources: docs/api/applyMiddleware.md36-225 docs/usage/migrating-to-modern-redux.mdx75-117
Redux Thunk 是用于处理异步逻辑的最广泛使用的中间件之一。它允许 action creator 返回函数而不是普通的 action 对象。这些函数(thunks)接收 dispatch 和 getState 作为参数。
thunk 的使用示例
Sources: docs/api/applyMiddleware.md73-202 docs/faq/Actions.md67-123
一个简单的中间件示例是一个日志记录器,它打印 action 和状态更改。
Sources: docs/api/applyMiddleware.md44-68
Store 增强器是高阶函数,它们组合 store 创建器以返回一个新的、增强的 store 创建器。它们比中间件更强大,允许您修改 store 的任何方面,而不仅仅是 dispatch 方法。
Sources: docs/api/applyMiddleware.md229-232 docs/faq/DesignDecisions.md67-71
applyMiddlewareapplyMiddleware 函数本身就是一个 store 增强器。它接受您的中间件函数,并返回一个修改 store dispatch 方法的 store 增强器。
当应用于 store 创建过程时,applyMiddleware 将 store 的 dispatch 方法替换为一个新函数,该函数在到达原始 dispatch 之前通过中间件链处理 action。
Sources: docs/api/applyMiddleware.md2-10 docs/api/applyMiddleware.md229-232
如果您需要将多个增强器应用于您的 store,可以使用 compose 函数将它们组合起来。
在 Redux Toolkit 中,增强器可以添加到 configureStore 中。
Sources: docs/api/compose.md33-47 docs/usage/migrating-to-modern-redux.mdx119-201
自定义中间件遵循标准中间件模式。
Sources: docs/usage/WritingCustomMiddleware.md1-140
中间件的应用顺序很重要。
在排序中间件时,请考虑以下因素:
Sources: docs/usage/WritingCustomMiddleware.md117-139 docs/api/applyMiddleware.md206-209
redux-batch 等库来批量处理 action。Sources: docs/faq/Performance.md116-154
在以下情况下使用中间件:
在以下情况下使用增强器:
经验法则:对于大多数自定义,请从中间件开始,仅在中间件不足的更高级情况下使用增强器。
Sources: docs/api/applyMiddleware.md229-232 docs/faq/DesignDecisions.md67-115
根据您的用例,以下是推荐的中间件选项:
| 用例 | 推荐的中间件 | 替代方案 |
|---|---|---|
| API 调用和数据获取 | RTK Query | createAsyncThunk |
| 简单异步逻辑 | Redux Thunk | - |
| 复杂异步工作流 | Redux Saga | Redux Observable |
| 日志记录 | redux-logger | 自定义日志中间件 |
| 持久连接 | 自定义 socket 中间件 | - |
| 本地存储持久化 | redux-persist | - |
Sources: docs/usage/side-effects-approaches.mdx52-61 docs/faq/CodeStructure.md153-169
当您在 TypeScript 中使用中间件时,需要正确地为中间件函数定义类型。
有关在 TypeScript 中使用中间件的更多详细信息,请参阅TypeScript 集成。
Sources: docs/usage/UsageWithTypescript.md256-294
中间件和增强器是强大的扩展机制,使 Redux 灵活且适应复杂的应用程序需求。中间件适用于大多数自定义需求,特别是处理副作用和异步逻辑,而增强器则在需要时提供更深层次的集成。
对于现代 Redux 应用程序,Redux Toolkit 的 configureStore 简化了中间件和增强器的设置,提供了良好的默认配置,同时仍然允许自定义。