记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 相关文章推荐
学习YUI.Ext 第四天--对话框Dialog的使用
Mar 10 Javascript
ajax 文件上传应用简单实现
Mar 03 Javascript
javascript date格式化示例
Sep 25 Javascript
window.location的重写及判断location是否被重写
Sep 04 Javascript
jQuery插件zepto.js简单实现tab切换
Jun 16 Javascript
javascript基础知识分享之类与函数化
Feb 13 Javascript
JavaScript高级程序设计(第三版)学习笔记6、7章
Mar 11 Javascript
浅谈JS函数定义方式的区别
Oct 30 Javascript
关于使用js算总价的问题
Jun 23 Javascript
React 使用browserHistory项目访问404问题解决
Jun 01 Javascript
vue组件间通信六种方式(总结篇)
May 15 Javascript
webpack实践之DLLPlugin 和 DLLReferencePlugin的使用教程
Jun 10 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/06/29 PHP
php数据类型判断函数有哪些
2013/09/23 PHP
php实现网页端验证码功能
2017/07/11 PHP
jquery异步调用页面后台方法&amp;#8207;(asp.net)
2011/03/01 Javascript
通过上下左右键和回车键切换光标实现代码
2013/03/08 Javascript
将查询条件的input、select清空
2014/01/14 Javascript
js中top的作用深入剖析
2014/03/04 Javascript
node.js中的buffer.toJSON方法使用说明
2014/12/14 Javascript
基于JavaScript实现动态添加删除表格的行
2016/02/01 Javascript
基于jQuery实现的无刷新表格分页实例
2016/02/17 Javascript
Javascript中判断一个值是否为undefined的方法详解
2016/09/28 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
2016/11/17 Javascript
node.js实现微信JS-API封装接口的示例代码
2017/09/06 Javascript
使用SVG基本操作API的实例讲解
2017/09/14 Javascript
原生js实现的移动端可拖动进度条插件功能详解
2019/08/15 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
python字符串排序方法
2014/08/29 Python
Python AES加密模块用法分析
2017/05/22 Python
Python测试人员需要掌握的知识
2018/02/08 Python
PyTorch线性回归和逻辑回归实战示例
2018/05/22 Python
利用selenium爬虫抓取数据的基础教程
2019/06/10 Python
Python3内置模块之base64编解码方法详解
2019/07/13 Python
Python 字符串、列表、元组的截取与切片操作示例
2019/09/17 Python
python、Matlab求定积分的实现
2019/11/20 Python
如何基于python实现画不同品种的樱花树
2020/01/03 Python
Python通过2种方法输出带颜色字体
2020/03/02 Python
Python如何执行系统命令
2020/09/23 Python
NIHAOMARKET官方海外旗舰店:意大利你好华人超市
2018/01/27 全球购物
爱尔兰电子产品购物网站:Komplett.ie
2018/04/04 全球购物
企业面试题试卷附带答案
2015/12/20 面试题
大学生优秀的自我评价分享
2013/10/22 职场文书
自愿离婚协议书2015
2015/01/26 职场文书
联欢会开场白
2015/06/01 职场文书
Python如何配置环境变量详解
2021/05/18 Python
Ajax请求超时与网络异常处理图文详解
2021/05/23 Javascript
浅谈@Value和@Bean的执行顺序问题
2021/06/16 Java/Android