菜单

Store API

相关源文件

Store API 是与 Redux store 交互的核心接口。Redux store 包含应用程序的完整状态树,并提供读取状态、通过 dispatch 更新状态、监听更改以及替换 reducers 的方法。本文档涵盖了 Store API 本身的方法和行为,而不是如何创建 store(有关此内容,请参阅核心 Redux API)。

核心概念

Redux store 是一个 JavaScript 对象,它包含应用程序的完整状态树。它不是一个类,只是一个具有几个方法的对象。

Store 有四个主要职责:

  • 持有应用程序状态
  • 允许通过 getState() 访问状态
  • 允许通过 dispatch(action) 更新状态
  • 通过 subscribe(listener) 注册监听器
  • 通过 subscribe(listener) 返回的函数处理监听器的注销

来源: docs/api/Store.md1-13

Store 方法

getState()

返回应用程序的当前状态树。它等于 store 的 reducer 返回的最后一个值。

返回值

  • 应用程序的当前状态树。

用途

备注

  • 在 reducer 执行期间,您不能调用 getState() (它会抛出错误)。
  • 在 reducer 内部,状态已作为参数提供——您应该使用该参数。

来源: docs/api/Store.md18-25 src/createStore.ts176-186

dispatch(action)

调度操作以触发状态更改。这是更新 Redux store 中状态的唯一方法。

Store 的 reducer 函数将使用当前状态和给定操作进行调用。reducer 的返回值将成为下一个状态,并且所有订阅者都将收到通知。

参数

  • action (Object): 一个描述要进行的更改的普通对象。操作必须具有 type 属性,该属性指示正在执行的操作的类型。type 属性必须是字符串。操作对象中的任何其他属性都取决于您。

返回值

  • 调度的操作对象。

备注

  • 操作必须是具有字符串 type 属性的普通 JavaScript 对象。
  • 您不能在 reducer 中调度操作(它会抛出错误)。
  • 默认情况下,仅支持同步的普通对象操作。对于异步操作或其他类型,您需要 redux-thunk 等中间件。
  • 中间件可以修改 dispatch() 的行为,以支持 Promise、Observable 或其他类型的操作。

来源: docs/api/Store.md31-79 src/createStore.ts280-319

subscribe(listener)

添加更改监听器。每次调度操作时都会调用它,并且应用程序状态树的某些部分可能会发生更改。然后,您可以在回调中调用 getState() 来读取当前状态。

参数

  • listener (Function): 每次调度操作时都会调用此回调。您应该在此回调中调用 getState() 来访问最新状态。

返回值

  • (Function): 一个注销更改监听器的函数。

备注

  • 监听器在根 reducer 返回新状态后被调用。
  • 您可以从订阅监听器中调用 dispatch(),但需谨慎。
    • 订阅在每次 dispatch() 调用之前被快照。
    • 在嵌套的 dispatch() 中多次调度时,监听器不会看到所有状态更改。
    • dispatch() 开始之前注册的所有订阅者都将使用最新状态进行调用。
  • 要注销,请调用 subscribe() 返回的函数。

来源: docs/api/Store.md84-132 src/createStore.ts211-253

replaceReducer(nextReducer)

替换当前用于计算状态的 reducer。

参数

  • nextReducer (Function): store 要使用的下一个 reducer。

使用场景

  • 代码拆分:动态加载 reducers
  • 为 reducers 实现热重载

备注

  • 这是一个高级 API,在大多数应用程序中您不需要使用它。
  • 调用时,它会调度一个内部的 ActionTypes.REPLACE 操作,以帮助填充新的状态树。

来源: docs/api/Store.md138-147 src/createStore.ts330-346

Store 作为 Observable

Redux store 实现了一个 Observable 接口,允许它与支持此模式的库(如 RxJS)集成。

此方法返回一个状态更改的最小 Observable。您可以使用它将 Redux 与响应式编程库集成。

与 RxJS 的使用示例

来源: src/types/store.ts51-62 src/createStore.ts354-390

Store Enhancers 和 Middleware

Store enhancers 是高阶函数,它们组合 store creator 来返回一个新的、增强的 store creator。Middleware 是一种特殊的 enhancer,它允许您自定义 dispatch 方法。

Store Enhancers

Store enhancers 可以为 Redux stores 添加功能,例如:

  • 中间件支持(通过 applyMiddleware
  • 时间旅行调试
  • 持久化功能

来源: src/types/store.ts220-232

中间件

Middleware 提供了一种在调度操作到达 reducer 之前拦截它们的机制。它通常用于日志记录、崩溃报告、处理异步操作、路由等。

Middleware 使用 applyMiddleware enhancer 应用。

来源: docs/api/applyMiddleware.md1-30 src/types/middleware.ts1-30

Redux 中的状态管理

Redux store 维护着应用程序状态的单一事实来源。状态只能通过调度操作来修改,这使得状态更改变得可预测且可追溯。

来源: docs/api/Store.md7-13

最佳实践

  1. 使用 Redux Toolkit:虽然您可以直接使用 Redux store API,但建议使用 Redux Toolkit 的 configureStore,它提供了更好的默认设置。

  2. 每个应用程序只有一个 Store:Redux 设计为每个应用程序只有一个 store。使用 combineReducers 来拆分 reducer 逻辑,而不是创建多个 store。

  3. 不可变更新:切勿直接修改状态。始终从 reducers 返回新的状态对象。

  4. 可序列化的状态和操作:保持状态和操作可序列化(无函数、Promise 等),以确保可预测的行为和 DevTools 兼容性。

  5. 最小状态形状:仅在 Redux store 中存储必要的最小数据。在需要时派生数据,而不是存储冗余信息。

  6. 使用 Selectors:创建 selector 函数来从状态中提取数据,而不是直接在组件中访问它。

来源: docs/api/createStore.md79-92

类型定义

对于 TypeScript 用户,Redux 为 Store API 提供了全面的类型定义。

来源: src/types/store.ts81-165