在线文档教程

存储(Store)

Store

一个存储保存你的应用程序的整个状态树。

改变其内部状态的唯一方法是在其上发送一个动作。

一家存储不是一个类。它只是一个有几个方法的对象。

要创建它,请将您的根部缩小函数传递给createStore

Flux 用户注意事项

存储方法

  • getState()

存储方法

getState()

返回应用程序的当前状态树。

它等于存储减速器返回的最后一个值。

返回

(任何):您的应用程序的当前状态树。

dispatch(action)

分派一个动作。这是触发变化状态的唯一途径。

存储的减少函数将与当前getState()结果和给定的action同步进行调用。其返回值将被视为下一个状态。它将从现在开始返回getState(),变化监听者将立即得到通知。

Flux 用户注意事项

参数

  • actionObject †):描述对您的应用程序有意义的更改的普通对象。动作是将数据存入存储区的唯一方式,因此无论是来自 UI 事件,网络回调还是其他来源(如 WebSockets)的任何数据都需要最终作为操作分派。操作必须有一个type指示正在执行的操作类型的字段。类型可以定义为常量并从另一个模块导入。因为字符串是可序列化的,所以最好使用type比符号更多的字符串。除此type之外,动作对象的结构真的取决于你。如果您有兴趣,请查看Flux 标准行动部门,了解如何构建行动的建议。

返回

(Object†):已调度的操作(请参阅注释)。

注释

†通过调用createStore获得的“vanilla”存储实现仅支持简单对象操作,并立即将其交给 reducer。

但是,如果用applyMiddleware包装createStore,中间件可以有不同的解释的行动,并提供调度异步操作的支持。异步操作通常是 Promise,Observables 或 Thunk 等异步基元。

中间件由社区创建,默认情况下不会与 Redux 一起提供。您需要显式安装像 redux-thunk redux-promise 这样的软件包才能使用。您也可以创建自己的中间件。

要了解如何描述异步 API 调用,请阅读操作创建者中的当前状态,执行副作用或链接它们以按顺序执行,请参阅示例applyMiddleware

示例

import { createStore } from 'redux' let store = createStore(todos, ['Use Redux']) function addTodo(text) { return { type: 'ADD_TODO', text } } store.dispatch(addTodo('Read the docs')) store.dispatch(addTodo('Read about the middleware'))

subscribe(listener)

添加更改侦听器。任何时候都会调用它,并且状态树的某些部分可能会发生更改。然后您可以调用getState()以读取回调中的当前状态树。

您可以通过更改监听器进行dispatch()调用,但需注意以下事项:

  • 监听器只应调用dispatch()以响应用户操作或特定条件(例如,当商店具有特定字段时调度动作)。没有任何条件的调用dispatch()在技​​术上是可能的,但是它会导致无限循环,因为每次调用dispatch()通常会再次触发监听器。

它是一个低级别的 API。最有可能的是,不是直接使用,而是使用 React(或其他)绑定。如果您通常使用回调作为响应状态更改的挂钩,则可能需要编写自定义observeStore实用程序。Store也是一个Observable,所以你可以用像 RxJS 这样的库进行更改subscribe

要取消订阅更改侦听器,请调用返回subscribe的函数。

参数

1. listener (Function): 调用任何时候调用的回调,并且状态树可能已经改变。 您可以在此回调中调用getState()来读取当前状态树。 期望商店的 reducer 是一个纯函数是合理的,所以你可以比较一下在状态树中的一些深层路径的参考,以了解它的值是否已经改变。

返回

Function):取消订阅更改侦听器的功能。

示例

function select(state) { return state.some.deep.property } let currentValue function handleChange() { let previousValue = currentValue currentValue = select(store.getState()) if (previousValue !== currentValue) { console.log( 'Some deep nested property changed from', previousValue, 'to', currentValue ) } } let unsubscribe = store.subscribe(handleChange) unsubscribe()

replaceReducer(nextReducer)

替换存储当前使用的减速器来计算状态。

它是一个高级 API 。 如果您的应用实现代码拆分,并且您想要动态加载某些减速器,则可能需要此操作。 如果您为 Redux 实施热重新加载机制,则可能还需要此操作。

参数

2. reducer函数)下一个用于存储的减速器。