记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的一个简单的鼠标跟随提示效果
Sep 23 Javascript
汉化英文版的Dreamweaver CS5并自动提示jquery
Nov 25 Javascript
js和jquery中循环的退出和继续学习记录
Sep 06 Javascript
javascript实现了照片拖拽点击置顶的照片墙代码
Apr 03 Javascript
超漂亮的Bootstrap 富文本编辑器summernote
Apr 05 Javascript
JavaScript中的await/async的作用和用法
Oct 31 Javascript
jquery css实现邮箱自动补全
Nov 14 Javascript
基于vue2实现左滑删除功能
Nov 28 Javascript
解决vue接口数据赋值给data没有反应的问题
Aug 27 Javascript
js中console在一行内打印字符串和对象的方法
Sep 10 Javascript
JS实现移动端双指缩放和旋转方法
Dec 13 Javascript
JavaScript实现刮刮乐效果
Nov 01 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中for循环语句的几种变型
2007/03/16 PHP
php 无法加载mysql的module的时候的配置的解决方案引发的思考
2012/01/27 PHP
一个简单的PHP验证码实现代码
2014/05/10 PHP
PHP const定义常量及global定义全局常量实例解析
2020/05/28 PHP
zeroclipboard复制到剪切板的flash
2010/08/04 Javascript
js实现图片放大缩小功能后进行复杂排序的方法
2012/11/08 Javascript
js实现点击添加一个input节点
2014/12/05 Javascript
node.js中的fs.readFile方法使用说明
2014/12/15 Javascript
javascript框架设计之框架分类及主要功能
2015/06/23 Javascript
今天抽时间给大家整理jquery和ajax的相关知识
2015/11/17 Javascript
基于node实现websocket协议
2016/04/25 Javascript
AngularJS基础 ng-list 指令详解及示例代码
2016/08/02 Javascript
AngularJS删除路由中的#符号的方法
2016/09/20 Javascript
详解vue 模拟后台数据(加载本地json文件)调试
2017/08/25 Javascript
js全屏事件fullscreenchange 实现全屏、退出全屏操作
2019/09/17 Javascript
解决ele ui 表格表头太长问题的实现
2019/11/13 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
两个命令把 Vim 打造成 Python IDE的方法
2016/03/20 Python
Python中defaultdict与lambda表达式用法实例小结
2018/04/09 Python
python判断一个集合是否为另一个集合的子集方法
2018/05/04 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
python递归法解决棋盘分割问题
2019/07/17 Python
Python调用scp向服务器上传文件示例
2019/12/22 Python
pytorch载入预训练模型后,实现训练指定层
2020/01/06 Python
tensorflow 实现数据类型转换
2020/02/17 Python
Python ATM功能实现代码实例
2020/03/19 Python
keras在构建LSTM模型时对变长序列的处理操作
2020/06/29 Python
Under Armour安德玛中国官网:美国高端运动科技品牌
2018/03/09 全球购物
中职生自我鉴定范文
2013/10/03 职场文书
思想专业自荐信范文
2013/12/25 职场文书
个人职业生涯规划书1500字
2013/12/31 职场文书
人大代表选举标语
2014/10/07 职场文书
高考升学宴主持词
2019/06/21 职场文书
Vue过滤器(filter)实现及应用场景详解
2021/06/15 Vue.js
VS2019连接MySQL数据库的过程及常见问题总结
2021/11/27 MySQL