记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 相关文章推荐
javascript中的继承实例代码
Apr 27 Javascript
js保留小数点后几位的写法
Jan 03 Javascript
100个不能错过的实用JS自定义函数
Mar 05 Javascript
浅谈js的setInterval事件
Dec 05 Javascript
jQuery 回调函数(callback)的使用和基础
Feb 26 Javascript
再谈JavaScript线程
Jul 10 Javascript
深入学习JavaScript对象
Oct 13 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
Jul 20 Javascript
基于AngularJS实现表单验证功能
Jul 28 Javascript
jQuery 利用ztree实现树形表格的实例代码
Sep 27 jQuery
React Native悬浮按钮组件的示例代码
Apr 05 Javascript
详解小程序不同页面之间通讯的解决方案
Nov 23 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另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
几道坑人的PHP面试题 试试看看你会不会也中招
2014/08/19 PHP
laravel安装和配置教程
2014/10/29 PHP
为你总结一些php信息函数
2015/10/21 PHP
PHP框架laravel的.env文件配置教程
2017/06/07 PHP
解决laravel5.4下的group by报错的问题
2019/10/16 PHP
JavaScript实现将文本框的值插入指定位置的方法
2015/08/13 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
jquery实现全屏滚动
2015/12/28 Javascript
解决拦截器对ajax请求的拦截实例详解
2016/12/21 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
详解Jquery Easyui的验证扩展
2017/01/09 Javascript
JS实现的base64加密解密操作示例
2018/04/18 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
vue中使用mxgraph的方法实例代码详解
2019/05/17 Javascript
微信小程序上传图片到php服务器的方法
2019/05/23 Javascript
微信小程序实现张图片合成为一张并下载
2019/07/16 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
2019/09/17 Javascript
vue-form表单验证是否为空值的实例详解
2019/10/29 Javascript
VueJS实现用户管理系统
2020/05/29 Javascript
vue video和vue-video-player实现视频铺满教程
2020/10/30 Javascript
[12:29]《一刀刀一天》之DOTA全时刻19:蝙蝠骑士田伯光再度不举
2014/06/10 DOTA
python去掉字符串中重复字符的方法
2014/02/27 Python
python抓取网页时字符集转换问题处理方案分享
2014/06/19 Python
Python检测生僻字的实现方法
2016/10/23 Python
python skimage 连通性区域检测方法
2018/06/21 Python
浅谈python新式类和旧式类区别
2019/04/26 Python
python中可以声明变量类型吗
2020/06/18 Python
python的launcher用法知识点总结
2020/08/07 Python
Python引入多个模块及包的概念过程解析
2020/09/21 Python
意大利一家专营包包和配饰的网上商店:Borse Last Minute
2019/08/26 全球购物
英国珠宝和手表专家:Pleasance & Harper
2020/10/21 全球购物
省优秀教师事迹材料
2014/01/30 职场文书
先进个人申报材料
2014/12/30 职场文书
婚礼父母答谢词
2015/01/04 职场文书
垂直极限观后感
2015/06/08 职场文书