记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 相关文章推荐
JS版网站风格切换实例代码
Oct 06 Javascript
通过event对象的fromElement属性解决热区设置主实体的一个bug
Dec 22 Javascript
将Datatable转化成json发送前台实现思路
Sep 06 Javascript
js判断日期时间有效性的方法
Oct 24 Javascript
动态的9*9乘法表效果的实现代码
May 16 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
Aug 10 Javascript
jQuery中get方法用法分析
Dec 07 Javascript
35个最好用的Vue开源库(史上最全)
Jan 03 Javascript
vue props 单项数据流实例分享
Feb 16 Javascript
详解JS函数防抖
Jun 05 Javascript
解决vue 给window添加和移除resize事件遇到的坑
Jul 21 Javascript
three.js中多线程的使用及性能测试详解
Jan 07 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 分页原理详解
2009/08/21 PHP
PHP实现本地图片转base64格式并上传
2020/05/29 PHP
jquery与prototype框架的详细对比
2013/11/21 Javascript
JavaScript定义变量和变量优先级问题探讨
2014/10/11 Javascript
JS如何实现文本框随文本的长度而增长
2015/07/30 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
jQuery实现图片左右滚动特效
2020/04/20 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
jQuery UI Draggable + Sortable 结合使用(实例讲解)
2017/09/07 jQuery
单页面vue引入百度统计的使用方法示例详解
2018/10/13 Javascript
React 全自动数据表格组件——BodeGrid的实现思路
2019/06/12 Javascript
vue中注册自定义的全局js方法
2019/11/15 Javascript
js实现简单的日历显示效果函数示例
2019/11/25 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
[44:50]2018DOTA2亚洲邀请赛 4.1 小组赛 A组 TNC vs VG
2018/04/02 DOTA
Pycharm学习教程(7)虚拟机VM的配置教程
2017/05/04 Python
解决Linux系统中python matplotlib画图的中文显示问题
2017/06/15 Python
利用Hyperic调用Python实现进程守护
2018/01/02 Python
在Windows中设置Python环境变量的实例讲解
2018/04/28 Python
Python实现最常见加密方式详解
2019/07/13 Python
如何在mac环境中用python处理protobuf
2019/12/25 Python
用python解压分析jar包实例
2020/01/16 Python
python读取yaml文件后修改写入本地实例
2020/04/27 Python
一家专门做特卖的网站:唯品会
2016/10/09 全球购物
英国独特的时尚和生活方式品牌:JOY
2018/03/17 全球购物
英国顶级水晶珠宝零售商之一:Tresor Paris
2019/04/27 全球购物
业务主管岗位职责范本
2013/12/25 职场文书
学校介绍信范文
2014/01/14 职场文书
时尚休闲吧创业计划书
2014/01/25 职场文书
大一新生检讨书
2014/10/29 职场文书
建议书范文
2015/02/05 职场文书
七一建党节慰问信
2015/02/14 职场文书
python实现自动化群控的步骤
2021/04/11 Python
攻略丨滑雪究竟该选哪款对讲机?
2022/02/18 无线电