记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对象的代码分享
Nov 02 Javascript
js的压缩及jquery压缩探讨(提高页面加载性能/保护劳动成果)
Jan 29 Javascript
JS注释所产生的bug 即使注释也会执行
Nov 19 Javascript
javascript页面渲染速度测试脚本分享
Apr 15 Javascript
使用js实现数据格式化
Dec 03 Javascript
Javascript中prototype的使用详解
Jun 18 Javascript
深入理解Vuex 模块化(module)
Sep 26 Javascript
vue中子组件调用兄弟组件方法
Jul 06 Javascript
Angular6 写一个简单的Select组件示例
Aug 20 Javascript
AngularJs返回前一页面时刷新一次前面页面的方法
Oct 09 Javascript
vue 使用axios 数据请求第三方插件的使用教程详解
Jul 05 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
Jan 08 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
javascript 小型动画组件与实现代码
2010/06/02 PHP
PHP下对字符串的递增运算代码
2010/08/21 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
php+mysql查询优化简单实例
2015/01/13 PHP
php分页查询的简单实现代码
2017/03/14 PHP
php事务回滚简单实现方法示例
2017/03/28 PHP
javascript 打印页面代码
2009/03/24 Javascript
GreyBox技术总结(转)
2010/11/23 Javascript
window.event快达到全浏览器支持了,以后使用就方便了
2011/11/30 Javascript
从URL中提取参数与将对象转换为URL查询参数的实现代码
2012/01/12 Javascript
jQuery bxCarousel实现图片滚动切换效果示例代码
2013/05/15 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
2013/08/18 Javascript
JS+DIV+CSS实现仿表单下拉列表效果
2015/08/18 Javascript
跟我学习javascript的隐式强制转换
2015/11/16 Javascript
javascript实现自动填写表单实例简析
2015/12/02 Javascript
JavaScript基础知识及常用方法总结
2016/01/10 Javascript
javascript动画之模拟拖拽效果篇
2016/09/26 Javascript
详解Vue.js基于$.ajax获取数据并与组件的data绑定
2017/05/26 Javascript
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
基于element-ui封装可搜索的懒加载tree组件的实现
2020/05/22 Javascript
vant实现购物车功能
2020/06/29 Javascript
分享15个最受欢迎的Python开源框架
2014/07/13 Python
Python的math模块中的常用数学函数整理
2016/02/04 Python
python实现泊松图像融合
2018/07/26 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
2019/10/23 Python
python利用百度云接口实现车牌识别的示例
2020/02/21 Python
CSS 3.0文字悬停跳动特效代码
2020/10/26 HTML / CSS
节省高达65%的城市景点费用:Go City
2019/07/06 全球购物
正宗的日本零食和糖果订阅盒:Bokksu
2019/11/21 全球购物
绩效专员岗位职责
2013/12/02 职场文书
优秀医生事迹材料
2014/02/12 职场文书
多媒体专业自我鉴定
2014/02/28 职场文书
图书室标语
2014/06/21 职场文书
小学运动会前导词
2015/07/20 职场文书
2016庆祝教师节新闻稿
2015/11/25 职场文书
Javascript webpack动态import
2022/04/19 Javascript