记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 StringBuilder类实现
Dec 22 Javascript
firefo xml 读写实现js代码
Jun 11 Javascript
JS小功能(offsetLeft实现图片滚动效果)实例代码
Nov 28 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
Dec 16 Javascript
10个很棒的jQuery代码片段
Sep 24 Javascript
妙用Angularjs实现表格按指定列排序
Jun 23 Javascript
vue2.0 路由不显示router-view的解决方法
Mar 06 Javascript
浅谈webpack 构建性能优化策略小结
Jun 13 Javascript
Spring boot 和Vue开发中CORS跨域问题解决
Sep 05 Javascript
JS使用new操作符创建对象的方法分析
May 30 Javascript
使用Vue-cli3.0创建的项目 如何发布npm包
Oct 10 Javascript
如何用threejs实现实时多边形折射
May 07 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之Smarty模板使用方法示例详解
2014/07/08 PHP
php实现递归抓取网页类实例
2015/04/03 PHP
php生成图片缩略图的方法
2015/04/07 PHP
PHP使用curl函数发送Post请求的注意事项
2016/11/26 PHP
PHP中单例模式的使用场景与使用方法讲解
2019/03/18 PHP
JavaScript 创建对象和构造类实现代码
2009/07/30 Javascript
JavaScript 原型学习总结
2010/10/29 Javascript
Javascript Throttle &amp; Debounce应用介绍
2013/03/19 Javascript
jQuery实现个性翻牌效果导航菜单的方法
2015/03/09 Javascript
javascript实现行拖动的方法
2015/05/27 Javascript
Bootstrap按钮功能之查询按钮和重置按钮
2016/10/26 Javascript
JS使用tofixed与round处理数据四舍五入的区别
2017/10/25 Javascript
ptyhon实现sitemap生成示例
2014/03/30 Python
MySQLdb ImportError: libmysqlclient.so.18解决方法
2014/08/21 Python
Python实现比较两个列表(list)范围
2015/06/12 Python
详解Python中的序列化与反序列化的使用
2015/06/30 Python
Python中使用装饰器来优化尾递归的示例
2016/06/18 Python
深入理解Python对Json的解析
2017/02/14 Python
windows系统下Python环境搭建教程
2017/03/28 Python
python批量获取html内body内容的实例
2019/01/02 Python
python解析含有重复key的json方法
2019/01/22 Python
python经典趣味24点游戏程序设计
2019/07/26 Python
一行python实现树形结构的方法
2019/08/09 Python
Python 3.8 新功能来一波(大部分人都不知道)
2020/03/11 Python
Pyinstaller 打包发布经验总结
2020/06/02 Python
从python读取sql的实例方法
2020/07/21 Python
详解python中GPU版本的opencv常用方法介绍
2020/07/24 Python
CSS3+font字体文件实现圆形半透明菜单具体步骤(图解)
2013/06/03 HTML / CSS
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
css3动画效果小结(推荐)
2016/07/25 HTML / CSS
腾讯公司的一个sql题
2013/01/22 面试题
最新英语专业学生求职信范文
2013/09/21 职场文书
社区优秀志愿者先进事迹
2014/05/09 职场文书
图书室标语
2014/06/21 职场文书
合作合同协议书范本
2015/01/27 职场文书
Windows 11要来了?微软文档揭示Win11太阳谷 / Win10有两个不同版本
2021/11/21 数码科技