记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 监视按键,按下回车键触发某方法的实现代码
May 11 Javascript
详解jQuery中的元素的属性和相关操作
Aug 14 Javascript
你有必要知道的25个JavaScript面试题
Dec 29 Javascript
CascadeView级联组件实现思路详解(分离思想和单链表)
Apr 12 Javascript
JS实现类似百叶窗下拉菜单效果
Dec 30 Javascript
详解PHP中pathinfo()函数导致的安全问题
Jan 05 Javascript
老生常谈javascript的面向对象思想
Aug 22 Javascript
解决element UI 自定义传参的问题
Aug 22 Javascript
vuejs点击class变化的实例
Sep 05 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
Sep 27 Javascript
小程序使用分包的示例代码
Mar 23 Javascript
vue祖孙组件之间的数据传递案例
Dec 07 Vue.js
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 URL编码解码函数代码
2009/03/10 PHP
php与paypal整合方法
2010/11/28 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
windwos下使用php连接oracle数据库的过程分享
2014/05/26 PHP
学习php设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
yii2的restful api路由实例详解
2019/05/14 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
jQuery对象与DOM对象之间的转换方法
2010/04/15 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
2015/01/05 Javascript
jQuery插件pagination实现分页特效
2015/04/12 Javascript
浅谈JavaScript的内置对象和浏览器对象
2016/06/03 Javascript
jQuery获取与设置iframe高度的方法
2016/08/01 Javascript
Node.js 回调函数实例详解
2017/07/06 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
2018/01/09 Javascript
jQuery实现表单动态添加与删除数据操作示例
2018/07/03 jQuery
JS实现全屏预览F11功能的示例代码
2018/07/23 Javascript
详解JS实现系统登录页的登录和验证
2019/04/29 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
基于脚手架创建Vue项目实现步骤详解
2020/08/03 Javascript
Python单链表简单实现代码
2016/04/27 Python
python实现冒泡排序算法的两种方法
2018/03/10 Python
django与小程序实现登录验证功能的示例代码
2019/02/19 Python
利用python脚本如何简化jar操作命令
2019/02/24 Python
python实现AES和RSA加解密的方法
2019/03/28 Python
在python里创建一个任务(Task)实例
2020/04/25 Python
Python数据可视化实现漏斗图过程图解
2020/07/20 Python
Oral-B荷兰:牙医最推荐的品牌
2020/02/25 全球购物
电大毕业自我鉴定
2014/02/03 职场文书
2014新课程改革心得体会
2014/03/10 职场文书
面试必备的求职信
2014/05/25 职场文书
比赛口号大全
2014/06/10 职场文书
2015年城管个人工作总结范文
2015/04/20 职场文书
最新的离婚协议书范本!
2019/07/02 职场文书
【DOTA2】当街暴打?PSG LGD vs VG - DPC 2022 WINTER TOUR CN
2022/04/02 DOTA
MySQL自定义函数及触发器
2022/08/05 MySQL
mysql通过group by分组取最大时间对应数据的两种有效方法
2022/09/23 MySQL