记React connect的几种写法(小结)


Posted in Javascript onSeptember 18, 2018

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

连接 React 组件与 Redux store。

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

参数

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

[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 也会被调用。

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

[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 组件。

第一种

最普通,最常见,delllee和官网第写法。

import React, { Component } from 'react';
import {connect} from 'react-redux';
import { Button } from 'antd-mobile';
import { addGunAction , removeGunAction , removeGunAsync}from './store/actionCreators'
class App extends Component {
 render() {
  console.log();
  return (
   <div className="App">
    <p>{this.props.gun}</p>
    <Button type="ghost" size="small" inline onClick={this.props.handeladd}>+</Button>
    <Button type="ghost" size="small" inline onClick={this.props.handeljian}>-</Button>
    <Button type="ghost" size="small" inline onClick={this.props.handelmanjian}>慢-</Button>
   </div>
  );
 }
}
const mapStateToProps=(state)=>({
  gun:state.gun
})
const mapDispachToProps=(dispatch)=>({
  handeladd(){
   dispatch(addGunAction())
  },
  handeljian(){
   dispatch(removeGunAction())
  },
  handelmanjian(){
   dispatch(removeGunAsync())
  }
})
export default connect(mapStateToProps,mapDispachToProps)(App);

第二种

初次接触,感觉有点绕,不太好理解,为什么点击了,直接就派发action了?

import React, { Component } from 'react';
import {connect} from 'react-redux';
import { Button } from 'antd-mobile';
import { addGunAction , removeGunAction , removeGunAsync}from './store/actionCreators'
class App extends Component {
 render() {
  console.log();
  return (
   <div className="App">
    <p>{this.props.gun}</p>
    {/*不用像第一种那样,点击调用一个方法,方法里再派发action
    这种直接点击派发action就可以*/}
    <Button type="ghost" size="small" inline onClick={this.props.addGunAction}>+</Button>
    <Button type="ghost" size="small" inline onClick={this.props.removeGunAction}>-</Button>
    <Button type="ghost" size="small" inline onClick={this.props.removeGunAsync}>慢-</Button>
   </div>
  );
 }
}
const mapStateToProps=(state,ownProps)=>({
  gun:state.gun
})
//这些action已经自动有了dispatch的功能
const actionCreators={ addGunAction , removeGunAction , removeGunAsync}
export default connect(mapStateToProps,actionCreators)(App);

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript 动态改变图片大小
Jun 11 Javascript
从零开始学习jQuery (十) jQueryUI常用功能实战
Feb 23 Javascript
javascrpt绑定事件之匿名函数无法解除绑定问题
Dec 06 Javascript
JS实现图片剪裁并预览效果
Aug 12 Javascript
JS实现页面数据无限加载
Sep 13 Javascript
JS实现的几个常用算法
Nov 12 Javascript
javascript 正则表达式去空行方法
Jan 24 Javascript
从setTimeout看js函数执行过程
Dec 19 Javascript
jQuery实现的卷帘门滑入滑出效果【案例】
Feb 18 jQuery
javascript系统时间设置操作示例
Jun 17 Javascript
微信小程序上传图片并等比列压缩到指定大小的实例代码
Oct 24 Javascript
OpenLayers3实现图层控件功能
Sep 25 Javascript
Vue循环组件加validate多表单验证的实例
Sep 18 #Javascript
vue2.0 + ele的循环表单及验证字段方法
Sep 18 #Javascript
JavaScript指定断点操作实例教程
Sep 18 #Javascript
对VUE中的对象添加属性
Sep 18 #Javascript
微信小程序适配iphoneX的实现方法
Sep 18 #Javascript
小程序兼容安卓和IOS数据处理问题及坑
Sep 18 #Javascript
解决vue attr取不到属性值的问题
Sep 18 #Javascript
You might like
PHP 获取文件路径(灵活应用__FILE__)
2013/02/15 PHP
PHP中使用gettext解决国际化问题的例子(i18n)
2014/06/13 PHP
用 Composer构建自己的 PHP 框架之设计 MVC
2014/10/30 PHP
php、java、android、ios通用的3des方法(推荐)
2016/09/09 PHP
php+ajax实现带进度条的上传图片功能【附demo源码下载】
2016/09/14 PHP
PHP调用QQ互联接口实现QQ登录网站功能示例
2019/10/24 PHP
javascript div 遮罩层封锁整个页面
2009/07/10 Javascript
prototype 中文参数乱码解决方案
2009/11/09 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
原生js和jQuery实现淡入淡出轮播效果
2015/12/25 Javascript
在bootstrap中实现轮播图实例代码
2017/06/11 Javascript
JavaScript之生成器_动力节点Java学院整理
2017/06/30 Javascript
React Native AsyncStorage本地存储工具类
2017/10/24 Javascript
本地搭建微信小程序服务器的实现方法
2017/10/27 Javascript
javascript获取图片的top N主色值方法详解
2018/01/26 Javascript
vue实现动态添加数据滚动条自动滚动到底部的示例代码
2018/07/06 Javascript
Angular设置别名alias的方法
2018/11/08 Javascript
Vue组件Draggable实现拖拽功能
2018/12/01 Javascript
简述ES6新增关键字let与var的区别
2019/08/23 Javascript
微信小程序canvas截取任意形状的实现代码
2020/01/13 Javascript
Python标准库之循环器(itertools)介绍
2014/11/25 Python
使用Python的urllib2模块处理url和图片的技巧两则
2016/02/18 Python
详解python分布式进程
2018/10/08 Python
python3实现点餐系统
2019/01/24 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
2019/06/17 Python
Python使用itchat模块实现简单的微信控制电脑功能示例
2019/08/26 Python
4款Python 类型检查工具,你选择哪个呢?
2020/10/30 Python
PyTorch中clone()、detach()及相关扩展详解
2020/12/09 Python
日本最新流行服饰网购:Nissen
2016/07/24 全球购物
橄榄树药房:OLIVEDA
2019/09/01 全球购物
师范生见习报告
2014/10/31 职场文书
2016幼儿园教师年度考核评语
2015/12/01 职场文书
2016年党员公开承诺书格式范文
2016/03/24 职场文书
写自招自荐信的绝招!
2019/04/19 职场文书
PHP对接阿里云虚拟号的实现(号码隐私保护)
2021/04/06 PHP
GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析
2021/06/15 Javascript