记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 相关文章推荐
基于jquery的实现简单的表格中增加或删除下一行
Aug 01 Javascript
基于jquery自己写tab滑动门(通用版)
Oct 30 Javascript
jquery toolbar与网页浮动工具条具体实现代码
Jan 12 Javascript
JavaScript字符串对象fromCharCode方法入门实例(用于把Unicode值转换为字符串)
Oct 17 Javascript
原创jQuery弹出层插件分享
Apr 02 Javascript
js图片跟随鼠标移动代码
Nov 26 Javascript
JavaScript接口的实现三种方式(推荐)
Jun 14 Javascript
jQuery获取与设置iframe高度的方法
Aug 01 Javascript
JavaScript实现图片轮播组件代码示例
Nov 22 Javascript
JS实现全屏的四种写法
Dec 30 Javascript
生产制造追溯系统之在线打印功能
Jun 03 Javascript
JS几个常用的函数和对象定义与用法示例
Jan 15 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实现伪静态方法汇总
2016/01/13 PHP
提高Laravel应用性能方法详解
2019/06/24 PHP
Code:findPosX 和 findPosY
2006/12/20 Javascript
Javascript this关键字使用分析
2008/10/21 Javascript
JS 面向对象的5钟写法
2009/07/31 Javascript
使用jQuery Ajax功能时需要注意的一个问题(内存溢出)
2012/05/30 Javascript
把input初始值不写value的具体实现方法
2013/07/04 Javascript
JavaScript设计模式之原型模式(Object.create与prototype)介绍
2014/12/28 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
js HTML5多媒体影音播放
2016/10/17 Javascript
简单实现nodejs上传功能
2017/01/14 NodeJs
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
JQuery EasyUI的一些常用组件
2017/07/12 jQuery
js装饰设计模式学习心得
2018/02/17 Javascript
jQuery+Cookie实现切换皮肤功能【附源码下载】
2018/03/25 jQuery
vue下拉菜单组件(含搜索)的实现代码
2018/11/25 Javascript
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
微信小程序tabBar设置实例解析
2019/11/14 Javascript
浅谈JavaScript中的“!!”作用
2020/08/03 Javascript
[01:08]2014DOTA2展望TI 剑指西雅图LGD战队专访
2014/06/30 DOTA
python基于queue和threading实现多线程下载实例
2014/10/08 Python
Python爬虫实例扒取2345天气预报
2018/03/04 Python
python读写LMDB文件的方法
2018/07/02 Python
用python统计代码行的示例(包括空行和注释)
2018/07/24 Python
超简单使用Python换脸实例
2019/03/27 Python
详解用python生成随机数的几种方法
2019/08/04 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
Tensorflow加载Vgg预训练模型操作
2020/05/26 Python
python安装和pycharm环境搭建设置方法
2020/05/27 Python
什么是反射
2012/03/17 面试题
采购文员岗位职责
2013/11/20 职场文书
高中生学习的自我评价
2013/12/14 职场文书
3.15国际消费者权益日主题活动活动总结
2014/03/16 职场文书
反邪教警示教育方案
2014/05/13 职场文书
JavaScript高级程序设计之基本引用类型
2021/11/17 Javascript
基于Apache Hudi在Google云构建数据湖平台的思路详解
2022/04/07 Servers