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_LOADING
或 STOP_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-loop 与 thunk 动作创建者一起使用
reducer.state.props 在嵌套动作 react/redux 中未定义