javascript - react-redux 中 action-reducer 链如何工作
问题描述
所以我一直在研究https://codesandbox.io/s/9on71rvnyo以了解 Redux 的工作原理。我到了那个部分components/VisibilityFilters.js
。我看到了setFilter(currentFilter)
,什么叫做动作redux/actions.js
。但对我来说,理解到此为止。我不明白这个动作是如何与减速器联系起来的。这只是一个函数调用!?做
export default connect(
mapStateToProps,
{ setFilter }
)(VisibilityFilters);
做所有的魔法?
解决方案
第一件事是connect()
在你的组件和你的 Redux 存储之间建立连接。这就是为什么您要导出为connect(mapStateToProps, { actionName })(ComponentName);
. 正如connect()
文档所述:
该
connect()
函数将 React 组件连接到 Redux 存储。它向其连接的组件提供它需要从存储中获取的数据片段,以及它可以用来向存储分派操作的功能。
因此,从您的组件中,您正在调用函数 - 操作 - 您创建的内容随着dispatch()
状态更改而调度。正如dispatch()
文件所述:
调度一个动作。这是触发状态更改的唯一方法。store 的 reduce 函数将与当前
getState()
结果和给定动作同步调用。它的返回值将被视为下一个状态。将从现在开始返回getState()
,并立即通知更改侦听器。
在reducer 的基础上会找到合适dispatch({type: 'STRING', payload: 'your data'})
的声明来改变状态。最后,reducer 返回的值将导致组件重新渲染。switch
type
用一个相当简单的画出我刚刚做的:
+1 重要:
有时我看到开发人员错过了导致问题的 reducer 的返回值。处理操作文档中有两点需要注意:
我们不会改变状态。我们用
Object.assign()
.Object.assign(state, { visibilityFilter: action.filter })
也是错误的:它会改变第一个参数。您必须提供一个空对象作为第一个参数。您还可以启用对象扩展运算符提案来{ ...state, ...newState }
代替编写。我们在默认情况下返回之前的状态。对于任何未知操作,返回之前的状态很重要。
我希望澄清!
推荐阅读
- wordpress - 将 wordpress 部署到 bitbucket
- aws-lambda - python lambda无法导入用户定义的模块
- forms - Nette getHttpData 包括未选中的复选框
- visual-studio-code - 在 Visual Studio Code 中键入表达式时出现重复提示
- wordpress - 来自 FPDF 的 Wordpress 数据库连接
- vba - 如何使用 vba 脚本检查 MS Word 段落行距
- android - 如何通过简单适配器在列表视图(android)中使用/获取任何行项的位置,而不通过点击侦听器获取它?
- angular - Angular 4 - 从 scss 文件中按名称读取规则
- autodesk-forge - 问题将 css 加载到按钮 Autodesk Forge
- c# - 通过两个项目共享 AppConfigurations.json