Redux - reducer 与动作的关系

Posted

技术标签:

【中文标题】Redux - reducer 与动作的关系【英文标题】:Redux - relation of reducers to actions 【发布时间】:2017-04-13 22:28:47 【问题描述】:

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

据我了解,是这样的:

    store.dispatch(action) 被调用 store 根据 action type 找到相关的 reducer Reducer 克隆当前状态对象,进行更改,将其传回(某处)

【问题讨论】:

【参考方案1】:

1:store怎么知道使用哪个reducer -> 这完全基于动作类型。

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

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

【讨论】:

谢谢。我现在开始把事情拼凑起来。【参考方案2】:

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

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

在这种情况下,我告诉我的 reducer 它只关心类型为 START_LOADINGSTOP_LOADING 的操作,并且在所有其他情况下它应该只返回它之前的状态。

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

【讨论】:

【参考方案3】:

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

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

如果您使用combineReducers()每个reducer 函数都会针对每个调度的操作执行。然后,他们纯粹根据动作类型决定动作是否应该影响其状态切片。如果是,则返回此切片的更新副本。如果其切片不受该操作的影响,则原样返回。

【讨论】:

如果一个特定的 reducer 和它的 action 之间存在孤立的关系,这样每次 action 调度时,action.type 只与相应 reducer 内的 case 匹配,而不是与 type 匹配怎么办? combineReducers() 中的 rootReducer 所代表的所有 reducer。请解释一下。提前致谢。

以上是关于Redux - reducer 与动作的关系的主要内容,如果未能解决你的问题,请参考以下文章

Redux 动作/reducers 与直接设置状态

将 redux-loop 与 thunk 动作创建者一起使用

reducer.state.props 在嵌套动作 react/redux 中未定义

所有的 redux 动作都应该有相应的 reducer 吗?

React Redux:动作创建者不调用reducer

在 Redux 中,如果所有 reducer 在动作触发时都被调用,那么是啥阻止了动作之间可能的命名冲突?