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 相关文章推荐
javascript 表格排序和表头浮动效果(扩展SortTable)
Apr 07 Javascript
jQuery EasyUI API 中文文档 - Pagination分页
Sep 29 Javascript
javascript淡入淡出效果的实现思路
Mar 31 Javascript
jquery 插件学习(六)
Aug 06 Javascript
jQuery+css+html实现页面遮罩弹出框
Mar 21 Javascript
javascript实现textarea中tab键的缩排处理方法
Jun 26 Javascript
JavaScript进阶练习及简单实例分析
Jun 03 Javascript
AngularJS 基础ng-class-even指令用法
Aug 01 Javascript
深入理解angular2启动项目步骤
Jul 15 Javascript
ES6模块化的import和export用法方法总结
Aug 08 Javascript
基于vue实现可搜索下拉框定制组件
Mar 26 Javascript
Vue将页面导出为图片或者PDF
Aug 17 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
php+xml实现在线英文词典查询的方法
2015/01/23 PHP
分享十款最出色的PHP安全开发库中文详细介绍
2015/03/22 PHP
php实现当前页面点击下载文件的简单方法
2016/09/22 PHP
php die()与exit()的区别实例详解
2016/12/03 PHP
jquery 可拖拽的窗体控件实现代码
2010/03/21 Javascript
事件绑定之小测试  onclick &amp;&amp; addEventListener
2011/07/31 Javascript
JavaScript设计模式之外观模式介绍
2014/12/28 Javascript
分享两个手机访问pc网站自动跳转手机端网站代码
2020/12/24 Javascript
JavaScript中数据结构与算法(四):串(BF)
2015/06/19 Javascript
js图片上传前预览功能(兼容所有浏览器)
2016/08/24 Javascript
DOM 事件的深入浅出(二)
2016/12/05 Javascript
简单理解js的prototype属性及使用
2016/12/07 Javascript
JavaScript如何一次性展示几万条数据
2017/03/30 Javascript
Angular中管道操作符(|)的使用方法
2017/12/15 Javascript
jquery+ajaxform+springboot控件实现数据更新功能
2018/01/22 jQuery
微信小程序中时间戳和日期的相互转换问题
2018/07/09 Javascript
[33:23]Secret vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python递归函数定义与用法示例
2017/06/02 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
pycharm 主题theme设置调整仿sublime的方法
2018/05/23 Python
详解Python3 对象组合zip()和回退方式*zip
2019/05/15 Python
梅尔频率倒谱系数(mfcc)及Python实现
2019/06/18 Python
Python restful框架接口开发实现
2020/04/13 Python
python实现逻辑回归的示例
2020/10/09 Python
CSS3弹性盒模型开发笔记(三)
2016/04/26 HTML / CSS
CSS3属性选择符介绍
2008/10/17 HTML / CSS
浅析图片上传及canvas压缩的流程
2020/06/10 HTML / CSS
轻松制作精彩视频:Animoto
2018/09/19 全球购物
IdealFit官方网站:女性蛋白质、补充剂和运动服装
2019/03/24 全球购物
俄罗斯鲜花递送:AMF
2020/04/24 全球购物
大学自我评价
2014/02/12 职场文书
法人授权委托书范本
2014/04/04 职场文书
我读书我快乐演讲稿
2014/05/07 职场文书
黄埔军校观后感
2015/06/10 职场文书
入党宣誓仪式主持词
2015/06/29 职场文书
Python各协议下socket黏包问题原理
2022/04/12 Python