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 简单的进度条实现代码
Mar 11 Javascript
node.js中使用socket.io制作命名空间
Dec 15 Javascript
node.js中的fs.stat方法使用说明
Dec 16 Javascript
javascript面向对象之对象的深入理解
Jan 13 Javascript
ajax+jQuery实现级联显示地址的方法
May 06 Javascript
JavaScript调用客户端Java程序的方法
Jul 27 Javascript
Angular中使用$watch监听object属性值的变化(详解)
Apr 24 Javascript
微信小程序使用swiper组件实现类3D轮播图
Aug 29 Javascript
解决Angular2 router.navigate刷新页面的问题
Aug 31 Javascript
微信小程序使用template标签实现五星评分功能
Nov 03 Javascript
Vue 处理表单input单行文本框的实例代码
May 09 Javascript
JS实现炫酷轮播图
Nov 15 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下过滤HTML代码的函数
2007/12/10 PHP
php中对xml读取的相关函数的介绍一
2008/06/05 PHP
PHP 设置MySQL连接字符集的方法
2011/01/02 PHP
Views rows style模板重写代码
2011/05/16 PHP
深入解析PHP内存管理之谁动了我的内存
2013/06/20 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
2017/06/19 PHP
jQuery 事件队列调整方法
2009/09/18 Javascript
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
让ie运行js时提示允许阻止内容运行的解决方法
2010/10/24 Javascript
jQuery源码分析-03构造jQuery对象-源码结构和核心函数
2011/11/14 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
jQuery实现form表单元素序列化为json对象的方法
2015/12/09 Javascript
JavaScript DOM 对象深入了解
2016/07/20 Javascript
再谈javascript注入 黑客必备!
2016/09/14 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
vue2.0构建单页应用最佳实战
2017/04/01 Javascript
javascript中this的用法实践分析
2019/07/29 Javascript
Vue 实现登录界面验证码功能
2020/01/03 Javascript
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
Python的Flask框架与数据库连接的教程
2015/04/20 Python
python基于隐马尔可夫模型实现中文拼音输入
2016/04/01 Python
Windows下python2.7.8安装图文教程
2016/05/26 Python
Python创建对称矩阵的方法示例【基于numpy模块】
2017/10/12 Python
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
解决Django生产环境无法加载静态文件问题的解决
2019/04/23 Python
Matplotlib使用Cursor实现UI定位的示例代码
2020/03/12 Python
CSS3颜色值RGBA与渐变色使用介绍
2020/03/06 HTML / CSS
福克斯租车:Fox Rent A Car
2017/04/13 全球购物
英国索普公园票务和酒店套餐:Thorpe Breaks
2019/09/14 全球购物
小学作文评语大全
2014/04/21 职场文书
感恩小明星事迹材料
2014/05/23 职场文书
商场收银员岗位职责
2015/04/07 职场文书
2016年春季开学典礼新闻稿
2015/11/25 职场文书
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP
python基于tkinter制作下班倒计时工具
2021/04/28 Python
Python开发五子棋小游戏
2022/04/28 Python