react-redux中connect的装饰器用法@connect详解


Posted in Javascript onJanuary 13, 2018

最近在琢磨react中的一些小技巧,这篇文章记录一下在redux中用装饰器来写connect。

 通常我们需要一个reducer和一个action,然后使用connect来包裹你的Component。假设你已经有一个key为main的reducer和一个action.js. 我们的App.js一般都这么写:

import React from 'react'
import {render} from 'react-dom'
import {connect} from 'react-redux'
import {bindActionCreators} from 'redux'
import action from 'action.js'

class App extends React.Component{
  render(){
    return <div>hello</div>
  }
}
function mapStateToProps(state){
  return state.main
}
function mapDispatchToProps(dispatch){
  return bindActionCreators(action,dispatch)
}
export default connect(mapStateToProps,mapDispatchToProps)(App)

ok了,这样并没有什么问题。看着connect的用法,有没有觉得很熟悉?典型的wrapper嘛,这里必须拿装饰器来装一波啊,稍微改改:

import React from 'react'
import {render} from 'react-dom'
import {connect} from 'react-redux'
import {bindActionCreators} from 'redux'
import action from 'action.js'

@connect(
 state=>state.main,
 dispatch=>bindActionCreators(action,dispatch)
)
class App extends React.Component{
  render(){
    return <div>hello</div>
  }
}

装完了,看起来舒服了。在我们实际项目中,可能是一个模块下面又有很多个小组件,它们都共用同样的action和reducer,我们在每个组件中都这么写,是不是有点太麻烦了?冗余代码太多了。

其实是可以把connect抽取出来的,比如写一个connect.js:

import {connect} from 'react-redux'
import {bindActionCreators} from 'redux'
import action from 'action.js'

export default connect(
 state=>state.main,
 dispatch=>bindActionCreators(action,dispatch)
)

然后在需要用到的组件中这么用:

import React from 'react'
import {render} from 'react-dom'
import connect from 'connect.js'

@connect
export default class App extends React.Component{
  render(){
    return <div>hello</div>
  }
}

这样就ok了,和最开始的用法比起来,是不是明显更装逼更好用?

需要说明的是,这里用了装饰器,需要安装模块babel-plugin-transform-decorators-legacy,然后在babel中配置:

{
  "plugins":[
    "transform-decorators-legacy"
  ]
}

如果你用的是vscode, 可以在项目根目录下添加jsconfig.json文件来消除代码警告:

{
  "compilerOptions": {
    "experimentalDecorators": true
  }
}

ok了,到这里真的完了。其实关于connect,是可以继续琢磨的,比如可以写一个通用的connect,所有的模块中所有的组件都可以用的那种,本文就不继续写下去了,以后有机会再写。

我一直觉得js里面把@ 这玩意儿叫装饰器不好,太难听了,像java那样,叫注解多好。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
表单元素事件 (Form Element Events)
Jul 17 Javascript
js数值计算时使用parseInt进行数据类型转换(jquery)
Oct 07 Javascript
JavaScript基础函数整理汇总
Jan 30 Javascript
JavaScript中逗号运算符介绍及使用示例
Mar 13 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
Nov 21 Javascript
利用BootStrap的Carousel.js实现轮播图动画效果
Dec 21 Javascript
JS 调用微信扫一扫功能
Dec 22 Javascript
Ionic+AngularJS实现登录和注册带验证功能
Feb 09 Javascript
jQuery表格(Table)基本操作实例分析
Mar 10 Javascript
mescroll.js上拉加载下拉刷新组件使用详解
Nov 13 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
Jul 07 Javascript
原生JS无缝滑动轮播图
Oct 22 Javascript
基于vue实现网站前台的权限管理(前后端分离实践)
Jan 13 #Javascript
详解webpack-dev-server使用http-proxy解决跨域问题
Jan 13 #Javascript
vuejs实现递归树型菜单组件
Jan 13 #Javascript
在vue中通过axios异步使用echarts的方法
Jan 13 #Javascript
详解基于vue-cli配置移动端自适应
Jan 13 #Javascript
javascript用rem来做响应式开发
Jan 13 #Javascript
深入理解ES6之数据解构的用法
Jan 13 #Javascript
You might like
新52大事件
2020/03/03 欧美动漫
PHP新手上路(五)
2006/10/09 PHP
php 一元分词算法
2009/11/30 PHP
在PHP中使用反射技术的架构插件使用说明
2010/05/18 PHP
PHP数组的定义、初始化和数组元素的显示实现代码
2016/11/05 PHP
PHP钩子实现方法解析
2019/05/21 PHP
详解phpstorm2020最新破解方法
2020/09/17 PHP
JavaScript 克隆数组最简单的方法
2009/02/12 Javascript
读jQuery之五(取DOM元素)
2011/06/20 Javascript
jquery 操作DOM的基本用法分享
2012/04/05 Javascript
S2SH整合JQuery+Ajax实现登录验证功能实现代码
2013/01/30 Javascript
jQuery中after的两种用法实例
2013/07/03 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
jQuery中prevUntil()方法用法实例
2015/01/08 Javascript
jQuery实现的动态文字变化输出效果示例【附演示与demo源码下载】
2017/03/24 jQuery
ES6中Math对象新增的方法实例详解
2017/04/25 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
vue修改对象的属性值后页面不重新渲染的实例
2018/08/09 Javascript
javascript中的event loop事件循环详解
2018/12/14 Javascript
详解vue 在移动端体验上的优化解决方案
2019/05/20 Javascript
100行代码实现vue表单校验功能(小白自编)
2019/11/19 Javascript
JS数组方法reverse()用法实例分析
2020/01/18 Javascript
python学习之hook钩子的原理和使用
2018/10/25 Python
Python lambda表达式用法实例分析
2018/12/25 Python
基于python 等频分箱qcut问题的解决
2020/03/03 Python
python爬虫实现获取下一页代码
2020/03/13 Python
全球性的众包图形设计市场:DesignCrowd
2021/02/02 全球购物
委托与事件是什么关系?为什么要使用委托
2014/04/18 面试题
日语专业毕业生求职信
2013/12/04 职场文书
工程质量承诺书
2014/03/27 职场文书
户外活动总结范文
2014/04/30 职场文书
2015年语文教师工作总结
2015/05/25 职场文书
详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
2021/12/06 MySQL
OpenCV实现常见的四种图像几何变换
2022/04/01 Python