记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 动态酷效果实现总结
Dec 27 Javascript
JavaScript window.location对象
Nov 14 Javascript
21个JavaScript事件(Events)属性汇总
Dec 02 Javascript
jquery中JSON的解析方式
Mar 16 Javascript
一道JS前端闭包面试题解析
Dec 25 Javascript
Javascript动画效果(1)
Oct 11 Javascript
详解Node.js串行化流程控制
May 04 Javascript
js实现Tab选项卡切换效果
Jul 17 Javascript
vue中本地静态图片路径写法
Mar 06 Javascript
详解webpack4多入口、多页面项目构建案例
May 25 Javascript
vue 左滑删除功能的示例代码
Jan 28 Javascript
小程序rich-text组件如何改变内部img图片样式的方法
May 22 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设计模式 Singleton(单例模式)
2011/06/26 PHP
php中convert_uuencode()与convert_uuencode函数用法实例
2014/11/22 PHP
php创建多级目录的方法
2015/03/24 PHP
php-app开发接口加密详解
2018/04/18 PHP
laravel中的一些简单实用功能
2018/11/03 PHP
PHP的curl函数的用法总结
2019/02/14 PHP
JavaScript 笔记二 Array和Date对象方法
2010/05/22 Javascript
Whatever:hover 无需javascript让IE支持丰富伪类
2010/06/29 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
基于OO的动画附加插件,可以实现弹跳、渐隐等动画效果 分享
2013/06/24 Javascript
jquery中的常用事件bind、hover、toggle等示例介绍
2014/07/21 Javascript
Bootstrap Table从服务器加载数据进行显示的实现方法
2016/09/29 Javascript
jquery实现图片列表鼠标移入微动
2016/12/01 Javascript
原生js验证简洁注册登录页面
2016/12/17 Javascript
关于vue.js发布后路径引用的问题解决
2017/08/15 Javascript
vue实现tab切换外加样式切换方法
2018/03/16 Javascript
JavaScript实现构造json数组的方法分析
2018/08/17 Javascript
js实现文件上传功能 后台使用MultipartFile
2018/09/08 Javascript
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
vue 实现根据data中的属性值来设置不同的样式
2020/08/04 Javascript
vue使用echarts实现水平柱形图实例
2020/09/09 Javascript
[56:24]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#1Liquid VS MVP.Phx第二局
2016/03/04 DOTA
[56:38]DOTA2-DPC中国联赛正赛Aster vs Magma BO3 第一场 3月5日
2021/03/11 DOTA
利用Python生成文件md5校验值函数的方法
2017/01/10 Python
Python中的十大图像处理工具(小结)
2019/06/10 Python
python os.fork() 循环输出方法
2019/08/08 Python
Django单元测试中Fixtures的使用方法
2020/02/26 Python
Omio荷兰:预订火车、巴士和机票
2018/11/04 全球购物
澳大利亚运动鞋商店:Platypus Shoes
2019/09/27 全球购物
测控技术与仪器个人求职信范文
2013/12/30 职场文书
工作总结与自我评价
2014/09/18 职场文书
投标单位介绍信
2015/05/05 职场文书
2016新教师培训心得体会范文
2016/01/08 职场文书
如何用python识别滑块验证码中的缺口
2021/04/01 Python
vue如何实现关闭对话框后刷新列表
2022/04/08 Vue.js
vue实现登陆页面开发实践
2022/05/30 Vue.js