react-redux中connect()方法详细解析


Posted in Javascript onMay 27, 2017

组件

React-Redux将所有组件分为两大类:展示组件(UI组件),容器组件

展示组件有以下几个特征:

  • 只负责 UI 的呈现,不带有任何业务逻辑
  • 没有状态(即不使用this.state这个变量)
  • 所有数据都由参数(this.props)提供
  • 不使用任何 Redux 的 API

容器组件有以下几个特征:

  • 负责管理数据和业务逻辑,不负责 UI 的呈现
  • 带有内部状态
  • 使用 Redux 的 API

总结为一点: 展示组件负责 UI 的呈现,容器组件负责管理数据和逻辑

connect方法解析

下图是connect()的概念图

react-redux中connect()方法详细解析

可以简单归纳为以下几点:

  • mapStateToProps必须是function,作为输入逻辑,
  • mapDispatchToProps可以是funciton,也可以是对象,作为输出,

connect()签名

connect([mapStateToProps], [mapDispatchToProps], [mergeProps], [options])

连接 React 组件与 Redux store。

连接操作不会改变原来的组件类,反而返回一个新的已与 Redux store 连接的组件类。

参数

1、 [mapStateToProps(state, [ownProps]): stateProps] (Function) : 如果定义该参数,组件将会监听 Redux store 的变化。任何时候,只要 Redux store 发生改变,mapStateToProps 函数就会被调用。该回调函数必须返回一个纯对象,这个对象会与组件的 props 合并。如果你省略了这个参数,你的组件将不会监听 Redux store。如果指定了该回调函数中的第二个参数 ownProps,则该参数的值为传递到组件的 props,而且只要组件接收到新的 props,mapStateToProps 也会被调用。

2、 [mapDispatchToProps(dispatch, [ownProps]): dispatchProps] (Object or Function) : 如果传递的是一个对象,那么每个定义在该对象的函数都将被当作 Redux action creator,而且这个对象会与 Redux store 绑定在一起,其中所定义的方法名将作为属性名,合并到组件的 props 中。如果传递的是一个函数,该函数将接收一个 dispatch 函数,然后由你来决定如何返回一个对象,这个对象通过 dispatch 函数与 action creator 以某种方式绑定在一起(提示:你也许会用到 Redux 的辅助函数 bindActionCreators() )。如果你省略这个 mapDispatchToProps 参数,默认情况下,dispatch 会注入到你的组件 props 中。如果指定了该回调函数中第二个参数 ownProps,该参数的值为传递到组件的 props,而且只要组件接收到新 props,mapDispatchToProps 也会被调用。

3、 [mergeProps(stateProps, dispatchProps, ownProps): props] (Function) : 如果指定了这个参数,mapStateToProps() 与 mapDispatchToProps() 的执行结果和组件自身的 props 将传入到这个回调函数中。该回调函数返回的对象将作为 props 传递到被包装的组件中。你也许可以用这个回调函数,根据组件的 props 来筛选部分的 state 数据,或者把 props 中的某个特定变量与 action creator 绑定在一起。如果你省略这个参数,默认情况下返回 Object.assign({}, ownProps, stateProps, dispatchProps) 的结果。

4、 [options] (Object)  如果指定这个参数,可以定制 connector 的行为。

[pure = true] (Boolean) : 如果为 true,connector 将执行 shouldComponentUpdate 并且浅对比 mergeProps 的结果,避免不必要的更新,前提是当前组件是一个“纯”组件,它不依赖于任何的输入或 state 而只依赖于 props 和 Redux store 的 state。默认值为 true。

[withRef = false] (Boolean) : 如果为 true,connector 会保存一个对被包装组件实例的引用,该引用通过 getWrappedInstance() 方法获得。默认值为 false

返回值

根据配置信息,返回一个注入了 state 和 action creator 的 React 组件。

容器组件使用 connect() 方法连接 Redux

我们用 react-redux 提供的 connect() 方法将“笨拙”的 Counter 转化成容器组件。connect() 允许你从 Redux store 中指定准确的 state 到你想要获取的组件中。这让你能获取到任何级别颗粒度的数据。

让我们看下,我们拥有一个 的展示组件,它有一个通过 props 传过来的值,和一个函数 onIncrement,当你点击 “Increment” 按钮时就会调用这个函数:

import { Component } from 'react';

export default class Counter extends Component {
 render() {
 return (
  <button onClick={this.props.onIncrement}>
  {this.props.value}
  </button>
 );
 }
}

containers/CounterContainer.js

import { Component } from 'react';
import { connect } from 'react-redux';

import Counter from '../components/Counter';
import { increment } from '../actionsCreators';

// 哪些 Redux 全局的 state 是我们组件想要通过 props 获取的?
function mapStateToProps(state) {
 return {
 value: state.counter
 };
}

// 哪些 action 创建函数是我们想要通过 props 获取的?
function mapDispatchToProps(dispatch) {
 return {
 onIncrement: () => dispatch(increment())
 };
}

export default connect(
 mapStateToProps,
 mapDispatchToProps
)(Counter);

总结

connect后面第二个括号是要添加prop的react组件,第一个括号中的参数是用来改变该组件prop的方法,第一个括号有两个参数,第一个参数是一个函数,返回一个对象,对象的键是该组件的prop属性,值是该prop的值;第二个参数也是一个函数,返回一个对象,对象的键同样是prop的属性名,值是一个redux的dispatch,当这个prop属性被用于触发时,dispatch会改变redux中state的值。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jquery 图片上传按比例预览插件集合
May 28 Javascript
jQuery操作checkbox选择(list/table)
Apr 07 Javascript
基于JavaScript 声明全局变量的三种方式详解
May 07 Javascript
解决extjs grid 不随窗口大小自适应的改变问题
Jan 26 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
May 27 Javascript
浅谈React 属性和状态的一些总结
Nov 21 Javascript
详解vue-cli+element-ui树形表格(多级表格折腾小计)
Apr 17 Javascript
vue模式history下在iis中配置流程
Apr 17 Javascript
实用的Vue开发技巧
May 30 Javascript
谈谈IntersectionObserver懒加载的具体使用
Oct 15 Javascript
Vue.js实现大屏数字滚动翻转效果
Nov 29 Javascript
vue实现商城秒杀倒计时功能
Dec 12 Javascript
react-router实现跳转传值的方法示例
May 27 #Javascript
简单实现JavaScript弹幕效果
Aug 27 #Javascript
Node.js中多进程模块Cluster的介绍与使用
May 27 #Javascript
详解webpack打包vue时提取css
May 26 #Javascript
jQuery插件imgAreaSelect基础讲解
May 26 #jQuery
jQuery插件ImgAreaSelect实现头像上传预览和裁剪功能实例讲解一
May 26 #jQuery
Angular2 之 路由与导航详细介绍
May 26 #Javascript
You might like
新52大事件
2020/03/03 欧美动漫
编写自己的php扩展函数
2006/10/09 PHP
如何使用Strace调试工具
2013/06/03 PHP
php实现的debug log日志操作类实例
2016/07/12 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
WordPress JQuery处理沙发头像
2009/06/22 Javascript
ajax异步刷新实现更新数据库
2012/12/03 Javascript
js输入框邮箱自动提示功能代码实现
2013/12/10 Javascript
JQuery页面的表格数据的增加与分页的实现
2013/12/10 Javascript
Eclipse下jQuery文件报错出现错误提示红叉
2014/01/13 Javascript
SuperSlide2实现图片滚动特效
2014/06/20 Javascript
js 判断图片是否加载完以及实现图片的预下载
2014/08/14 Javascript
Shell脚本实现Linux系统和进程资源监控
2015/03/05 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
JavaScript电子时钟倒计时
2016/01/09 Javascript
JavaScript之生成器_动力节点Java学院整理
2017/06/30 Javascript
Vue 多层组件嵌套二种实现方式(测试实例)
2017/09/08 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
一篇文章介绍redux、react-redux、redux-saga总结
2019/05/23 Javascript
Python获取DLL和EXE文件版本号的方法
2015/03/10 Python
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
Python md5与sha1加密算法用法分析
2017/07/14 Python
Python定时器实例代码
2017/11/01 Python
使用pandas read_table读取csv文件的方法
2018/07/04 Python
在python中bool函数的取值方法
2018/11/01 Python
pytorch对可变长度序列的处理方法详解
2018/12/08 Python
Pandas_cum累积计算和rolling滚动计算的用法详解
2019/07/04 Python
Django框架ORM数据库操作实例详解
2019/11/07 Python
Python Django框架模板渲染功能示例
2019/11/08 Python
Python预测2020高考分数和录取情况
2020/07/08 Python
采用冷却技术的超自然舒适度:GhostBed床垫
2018/09/18 全球购物
绿色校园广播稿
2014/10/13 职场文书
2014幼儿园大班工作总结
2014/11/10 职场文书
2015年国庆节寄语
2015/08/17 职场文书
导游词之山东孔庙
2019/11/04 职场文书
Java+swing实现抖音上的表白程序详解
2022/06/25 Java/Android