本页面由 PageTurner AI 翻译(测试版)。未经项目官方认可。 发现错误? 报告问题 →
术语表
本文档是 Redux 核心术语的术语表,包含对应的类型签名。类型使用 Flow 标注法进行文档化。
状态
type State = any
状态(也称为_状态树_)是一个广义术语,但在 Redux API 中通常指由 store 管理并通过 getState() 返回的单一状态值。它代表 Redux 应用程序的完整状态,通常是一个深度嵌套的对象。
按照约定,顶层状态应为对象或 Map 等键值集合,但从技术上讲可以是任意类型。尽管如此,你仍需尽力保持状态可序列化。不要在其中放置无法轻松转换为 JSON 的内容。
动作
type Action = Object
_动作_是一个表示状态变更意图的普通对象。动作是向 store 注入数据的唯一方式。任何数据——无论是来自 UI 事件、网络回调还是 WebSockets 等其他来源——最终都需要通过分发动作进入系统。
动作必须包含 type 字段以指示动作类型。类型可定义为常量并从其他模块导入。使用字符串作为 type 比使用 Symbols 更合适,因为字符串可序列化。
除 type 外,动作对象的结构完全由你决定。若需参考,可查阅 Flux Standard Action 获取动作构建规范建议。
另请参阅下方的异步动作。
Reducer
type Reducer<S, A> = (state: S, action: A) => S
Reducer 是接收累积值和输入值并返回新累积值的函数。它们用于将值集合归约为单个值。
Reducer 并非 Redux 独有——它们是函数式编程的核心概念。即使是非函数式语言(如 JavaScript)也内置了归约 API,例如 JavaScript 中的 Array.prototype.reduce()。
在 Redux 中,累积值是状态对象,被归约的值是动作。Reducer 根据先前状态和动作计算新状态。它们必须是_纯函数_——即给定相同输入必然返回相同输出,且不应产生副作用。这是实现热重载和时间旅行等高级特性的基础。
Reducer 是 Redux 中最重要的概念。
切勿在 reducer 中进行 API 调用。
分发函数
type BaseDispatch = (a: Action) => Action
type Dispatch = (a: Action | AsyncAction) => any
分发函数(简称 dispatch 函数)是接收动作或异步动作的函数,它可能向 store 分发一个或多个动作,也可能不进行分发。
需区分通用分发函数与 store 实例提供的无中间件基础 dispatch 函数。
基础 dispatch 函数_始终_同步将动作发送至 store 的 reducer,同时携带 store 返回的先前状态以计算新状态。它要求动作为普通对象且可直接被 reducer 消费。
中间件封装了基础 dispatch 函数。它使分发函数除处理常规动作外,还能处理异步动作。中间件可在将动作/异步动作传递给下一个中间件前,对其进行转换、延迟、忽略或解释。详见下文说明。
Action Creator
type ActionCreator<A, P extends any[] = any[]> = (...args: P) => Action | AsyncAction
动作创建函数(Action Creator)简单来说就是用于创建动作的函数。请注意区分这两个概念:动作是信息负载,而动作创建函数则是生成动作的工厂。
调用动作创建函数仅生成动作,但不会自动派发。你需要调用 store 的 dispatch 方法才能真正触发状态变更。有时我们称_绑定动作创建函数_为直接调用动作创建函数并立即将其结果派发到特定 store 实例的函数。
如果动作创建函数需要读取当前状态、执行 API 调用或引发路由跳转等副作用,它应该返回一个异步动作而非普通动作。
异步动作
type AsyncAction = any
_异步动作_是传递给派发函数的值,但尚未准备好被 reducer 消费。在被发送到基础 dispatch() 函数前,它会通过中间件转换成一个(或一系列)普通动作。根据使用的中间件不同,异步动作可能有不同类型。它们通常是异步原语(如 Promise 或 thunk 函数),不会立即传递给 reducer,而是在操作完成后触发动作派发。
中间件
type MiddlewareAPI = { dispatch: Dispatch, getState: () => State }
type Middleware = (api: MiddlewareAPI) => (next: Dispatch) => Dispatch
中间件是一个高阶函数,通过组合派发函数来返回新的派发函数。它通常将异步动作转换为普通动作。
中间件可通过函数组合实现链式调用。常用于记录动作日志、执行路由跳转等副作用,或将异步 API 调用转为同步动作序列。
详见 applyMiddleware(...middlewares) 了解中间件的详细用法。
Store
type Store = {
dispatch: Dispatch
getState: () => State
subscribe: (listener: () => void) => () => void
replaceReducer: (reducer: Reducer) => void
}
Store 是承载应用状态树的对象。 Redux 应用中应仅存在单个 store,因为组合发生在 reducer 层级。
-
dispatch(action)即上文描述的基础派发函数 -
getState()返回 store 的当前状态 -
subscribe(listener)注册状态变更时的回调函数 -
replaceReducer(nextReducer)可用于实现热重载和代码分割,通常较少使用
详见完整的 store API 文档获取更多细节。
Store 创建函数
type StoreCreator = (reducer: Reducer, preloadedState: ?State) => Store
Store 创建函数是用于创建 Redux store 的函数。与派发函数类似,我们需要区分基础 store 创建函数(即 Redux 包导出的 createStore(reducer, preloadedState))和经过 store 增强器返回的新创建函数。
Store 增强器
type StoreEnhancer = (next: StoreCreator) => StoreCreator
Store 增强器是通过组合 store 创建函数来返回增强版 store 创建函数的高阶函数。这与中间件类似,允许以可组合方式扩展 store 接口。
Store 增强器概念类似于 React 的高阶组件(有时也称为"组件增强器")。
由于 store 并非实例而是普通函数集合对象,因此可以轻松创建副本并修改,而不会改变原始 store。compose 文档中的示例演示了这种用法。
通常你不需要编写 store 增强器,但可能会使用开发者工具提供的增强器。它使得时光旅行功能可在应用无感知的情况下实现。有趣的是,Redux 中间件实现本身就是一个 store 增强器。