当前位置:首页 > 日记 > 正文

react-redux中connect | 方法详细解析

react-redux中connect | 方法详细解析

组件

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

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

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

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

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

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

connect方法解析

下图是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的值。

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

相关文章

微信小程序-getUserInfo回调的实例

微信小程序-getUserInfo回调的实例

回调,详解,实例,程序,电脑软件,微信小程序-getUserInfo回调的实例详解前言:这里就不吹嘘微信小程序有多厉害了,毕竟也不是我写的,直接谈谈我在做小程序开发时遇到的奇异Bug。getUserInfo多次调用:对于wx.getUserInfo应该很多开发者都用过,用于获…

不等于符号怎么打

不等于符号怎么打

不等于,符号,电脑软件,不等于符号又称不等于号,它表示两个数或量不相等关系的符号。不等号是在等号&ldquo;=&rdquo;上面加上一条斜杠&ldquo;&ne;&rdquo;。现在常用关系类符号有,等号&ldquo;=&rdquo;、不等于号&ldquo;&ne;&rdquo;、大于号&ldq…

使用bootstrap-paginator.js 分页

使用bootstrap-paginator.js 分页

分页,请求,异步,示例,电脑软件,使用bootstrap-paginator.js 分页来进行ajax 异步分页请求具体的做法如下 :首先定义一个异步提交请求的ajax 函数,其完整的函数如下:var nid= $("#lbnid").val(); // 获取当前新闻编号 var cpage = 1; // 当前…

如何防止Excel单元格区域内重复录

如何防止Excel单元格区域内重复录

数据,区域内,单元格,如何防止,电脑软件,今天给大家发布一个有关防止重复录入数据的数据有效性技巧。场景:适合公司人事、行政、财务、销售等进行Excel表格模板定制的办公人士。问题:如何防止Excel单元格区域内重复录入数据?解答:利用Excel的数…

PHP自定义函数实现数组比较功能示

PHP自定义函数实现数组比较功能示

自定义函数,数组,示例,功能,电脑软件,本文实例讲述了PHP自定义函数实现数组比较功能。分享给大家供大家参考,具体如下:<?php //数组使用标准比较运算符这样比较的 function standard_array_compare($op1,$op2) { if(count($op1) < count($op2…

怎么在WPS表格中使用if函数WPS表格

怎么在WPS表格中使用if函数WPS表格

函数,步骤,嵌套,表格,使用方法,  列如在统计表里,计价的方式不同,金额有所不同,用到IF函数就方便许多了。那么下面小编就教你怎么在WPS表格中使用if函数。希望对你有帮助!WPS表格中使用if函数的步骤一、打开统计表,货品种类不同,计价方式不同,有…

word如何设置表格数字水平居中word

word如何设置表格数字水平居中word

数字,设置,步骤,表格,如何设置,  word表格中的文字或者是数字有时总是靠下有时总是靠上,那么怎样把它水平居中呢,那么下面就由小编给大家分享下word设置表格数字水平居中的技巧,希望能帮助到您。word设置表格数字水平居中的步骤步骤一:首先打…

VS2013无法启动 IIS Express Web解

VS2013无法启动 IIS Express Web解

无法启动,解决办法,电脑软件,IIS,Web,不要勾选【覆盖应用程序根URL(U)】,或让【覆盖应用程序根URL(U)】下面的输入框和上面的输入框的地址一样!使用VS2013有一段时间了,因前期都是编写C/S程序,没有使用到B/S调试器。前几日,创建了一个MVC项目,突然发…

ps如何实现换脸照片效果

ps如何实现换脸照片效果

照片,方法,换脸,效果,如何实现,  很多恶搞的图片都是换脸的,使用ps可以轻松实现。但是很多同学还不太清楚。那么接下来下面是小编整理的一些关于ps如何实现换脸照片效果,供您参阅。ps实现换脸照片效果的方法第一步:打开素材2用自由套索工具…

JS去掉字符串末尾的标点符号及删除

JS去掉字符串末尾的标点符号及删除

删除,字符串,方法,字符,标点符号,需求:去掉js字符串末尾的标点符号原字符串:Hello World!目标字符串:Hello World方式一:stringObject.slice(start,end)start : 要抽取的片断的起始下标。如果是负数,则该参数规定的是从字符串的尾部开始算起的位…

ps滤镜云彩怎么用? ps絮云滤镜的教

ps滤镜云彩怎么用? ps絮云滤镜的教

滤镜,教程,云彩,电脑软件,ps,ps中想要使用滤镜处理图片,今天我们就来看看絮云滤镜的使用方法。软件名称:Adobe photoshop 7.01 官方正式简体中文版软件大小:154MB更新时间:2013-04-191、打开一个PS的软件,然后打开一张需要使用滤镜的图片,比如一…

如何在数据中心服务器上搭载虚拟机

如何在数据中心服务器上搭载虚拟机

数据中心,虚拟机,服务,器上,如何在,  为了尽可能地优化虚拟机的部署,你必须仔细对工作负载进行考分析,确认它们究竟需要哪些进程和资源,以及在什么时候需要。例如,如果你要在网络上运行Windows服务,就应该是这样的:域控制器在高峰时期往往需要…