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 27 Javascript
jquery简单实现鼠标经过导航条改变背景图
Dec 17 Javascript
用javascript关闭本窗口不弹出询问框的方法
Sep 12 Javascript
Javascript数组操作函数总结
Feb 05 Javascript
jQuery中使用each处理json数据
Apr 23 Javascript
清除浏览器缓存的几种方法总结(必看)
Dec 09 Javascript
移动端刮刮乐的实现方式(js+HTML5)
Mar 23 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
Jul 11 Javascript
js实现扫雷小程序的示例代码
Sep 27 Javascript
jQuery中将json数据显示到页面表格的方法
May 27 jQuery
详解关于vue2.0工程发布上线操作步骤
Sep 27 Javascript
使用xampp将angular项目运行在web服务器的教程
Sep 16 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
Terran兵种介绍
2020/03/14 星际争霸
php获取$_POST同名参数数组的实现介绍
2013/06/30 PHP
在Win7 中为php扩展配置Xcache
2014/10/08 PHP
php采用file_get_contents代替使用curl实例
2014/11/07 PHP
javascript的事件描述
2006/09/08 Javascript
JavaScript高级程序设计 读书笔记之八 Function类及闭包
2012/02/27 Javascript
js复制到剪切板的实例方法
2013/06/28 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
JS的get和set使用示例
2014/02/20 Javascript
jQuery中ajax的get()方法用法实例
2014/12/26 Javascript
AngularJS Module方法详解
2015/12/08 Javascript
Node.js读取文件内容示例
2017/03/07 Javascript
layui分页效果实现代码
2017/05/19 Javascript
微信小程序封装http访问网络库实例代码
2017/05/24 Javascript
js变量值传到php过程详解 将php解析成数据
2019/06/26 Javascript
原生js实现针对Dom节点的CRUD操作示例
2019/08/26 Javascript
js String.prototype.trim字符去前后空格的扩展
2020/08/23 Javascript
javascript 易错知识点实例小结
2020/04/25 Javascript
解决Vue-cli无法编译es6的问题
2020/10/30 Javascript
vue实现动态表格提交参数动态生成控件的操作
2020/11/09 Javascript
绘制微信小程序验证码功能的实例代码
2021/01/05 Javascript
[03:07]完美世界DOTA2联赛PWL DAY10 决赛集锦
2020/11/11 DOTA
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
2016/11/19 Python
Python3多线程操作简单示例
2018/05/22 Python
OpenCV+Python--RGB转HSI的实现
2019/11/27 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
请解释一下webService? 如何用.net实现webService
2014/06/09 面试题
房地产融资计划书
2014/01/10 职场文书
元旦晚会邀请函
2014/01/27 职场文书
赵乐秦在党的群众路线教育实践活动总结大会上的讲话稿
2014/10/25 职场文书
2014年安置帮教工作总结
2014/12/11 职场文书
同学会感言
2015/07/30 职场文书
班级元旦晚会开幕词
2016/03/04 职场文书
HTML5中 rem适配方案与 viewport 适配问题详解
2021/04/27 HTML / CSS
Python 批量下载阴阳师网站壁纸
2021/05/19 Python
mybatis源码解读之executor包语句处理功能
2022/02/15 Java/Android