记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定时保存表单数据的代码
Mar 17 Javascript
用JS实现一个TreeMenu效果分享
Aug 28 Javascript
createElement与createDocumentFragment的点点区别小结
Dec 19 Javascript
推荐30个新鲜出炉的精美 jQuery 效果
Mar 26 Javascript
Jquery加载时从后台读取数据绑定到dropdownList实例
Jun 09 Javascript
jQuery Ajax中的事件详细介绍
Apr 16 Javascript
浅析JavaScriptSerializer类的序列化与反序列化
Nov 22 Javascript
jquery仿ps颜色拾取功能
Mar 08 Javascript
详解Nuxt.js Vue服务端渲染摸索
Feb 08 Javascript
jQuery使用jsonp实现百度搜索的示例代码
Jul 08 jQuery
详解Vue的异步更新实现原理
Dec 22 Vue.js
关于对TypeScript泛型参数的默认值理解
Jul 15 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操作csv文件代码实例汇总
2014/09/22 PHP
我整理的PHP 7.0主要新特性
2016/01/07 PHP
js判断运行jsp页面的浏览器类型以及版本示例
2013/10/30 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
javascript实现炫酷的拖动分页
2015/05/11 Javascript
在JavaScript中处理时间之getHours()方法的使用
2015/06/10 Javascript
jQuery each函数源码分析
2016/05/25 Javascript
Javascript之Number对象介绍
2016/06/07 Javascript
解决微信浏览器Javascript无法使用window.location.reload()刷新页面
2016/06/21 Javascript
浅谈JSON.stringify()和JOSN.parse()方法的不同
2016/08/29 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
微信小程序 点击控件后选中其它反选实例详解
2017/02/21 Javascript
深入理解vuex2.0 之 modules
2017/11/20 Javascript
webpack-url-loader 解决项目中图片打包路径问题
2019/02/15 Javascript
js console.log打印对象时属性缺失的解决方法
2019/05/23 Javascript
django中使用vue.js的要点总结
2019/07/07 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
将字典转换为DataFrame并进行频次统计的方法
2018/04/08 Python
Python设计模式之享元模式原理与用法实例分析
2019/01/11 Python
Python matplotlib以日期为x轴作图代码实例
2019/11/22 Python
python如何实现不可变字典inmutabledict
2020/01/08 Python
Python连接HDFS实现文件上传下载及Pandas转换文本文件到CSV操作
2020/06/06 Python
解决python3中os.popen()出错的问题
2020/11/19 Python
文秘专业应届生求职信范文
2013/11/14 职场文书
出纳岗位职责范本
2013/12/01 职场文书
护理个人求职信范文
2014/01/08 职场文书
教师业务学习制度
2014/01/25 职场文书
英文求职信写作小建议
2014/02/16 职场文书
全运会口号
2014/06/20 职场文书
篮球兴趣小组活动总结
2014/07/07 职场文书
婚内分居协议书范文
2014/11/26 职场文书
圆明园纪录片观后感
2015/06/03 职场文书
于丹讲座视频观后感
2015/06/15 职场文书
工人先锋号事迹材料(2016精选版)
2016/03/01 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis