Redux - 减速器与动作的关系

Redux - relation of reducers to actions

我是 react/redux 的新手。我试图弄清楚 redux 中的所有部分是如何相互作用的。给我带来麻烦的一件事是理解动作和减速器之间的关系。当一个动作被调用时,store 如何知道要使用哪个 reducer?它是否完全基于操作类型名称?类型名称必须是唯一的吗? reducer 将新状态对象传递给谁或什么,store 或 action?

据我了解,它是这样的:

  1. store.dispatch(动作)被调用
  2. store根据action类型查找相关reducer
  3. Reducer 克隆当前状态对象,进行更改,将其传回(某处)

一般来说,你只有一个 reducer 负责完整的状态。

这个 reducer 可以拆分成不同的更小的 reducer 函数,每个函数负责状态的不同部分。例如 Redux's combineReducers() utility 可以做到,但您也可以手动完成。

如果您使用 combineReducers()每个 reducer 函数都会为每个分派的操作执行。然后他们完全根据动作类型决定该动作是否应该影响其状态片。 如果是这样,则返回该片的更新副本。如果其切片不受操作影响,则返回不变。

1:store如何知道使用哪个reducer -> 这完全基于操作类型。

2:类型名称必须是唯一的吗? -> 这不是规则。但大多数情况下,是的。每个动作都有一个不同的类型名称,并且会调用相应的 reducer。

3:reducer 将新的状态对象传递给谁或什么,store 或 action? -> reducer 不会在任何地方传递新的状态对象。基本上,它会向所有正在侦听它的 React 组件触发状态更改事件。所有侦听更改状态的组件都会使用新版本的状态重新呈现,从而更新您的 DOM.

在典型的 Redux 设置中,动作被分派给所有减速器,由减速器决定他们是否关心该动作。一个常见的模式是 reducer 中的一个开关,它检查 action.type,有它关心的动作的案例和一个只有 return 的当前状态的默认案例,如下所示:

export default (state = false, action) => {
  switch (action.type) {
    case START_LOADING:
      return true;
    case STOP_LOADING:
      return false;
    default:
      return state;
  }
}

在这种情况下,我告诉我的减速器它只关心类型为 START_LOADINGSTOP_LOADING 的操作,而在所有其他情况下它应该只是 return 它的先前状态.

为了更好地理解 Redux(和 Flux),我建议您查看 Code Cartoons by Lin Clark or her video,其中涵盖了大部分相同的内容。