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 相关文章推荐
javascript+dom树型菜单类,希望朋友们一起进步
May 03 Javascript
myEvent.js javascript跨浏览器事件框架
Oct 24 Javascript
javascript 日期时间 转换的方法
Feb 21 Javascript
js身份证判断方法支持15位和18位
Mar 18 Javascript
浅谈JavaScript数据类型
Mar 03 Javascript
js方法数据验证的简单实例
Sep 17 Javascript
jQuery图片轮播(二)利用构造函数和原型创建对象以实现继承
Dec 06 Javascript
js处理层级数据结构的方法小结
Jan 17 Javascript
浅谈在fetch方法中添加header后遇到的预检请求问题
Aug 31 Javascript
在vue中封装可复用的组件方法
Mar 01 Javascript
详解js创建对象的几种方法及继承
Apr 12 Javascript
node.js中stream流中可读流和可写流的实现与使用方法实例分析
Feb 13 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
PHP各种异常和错误的拦截方法及发生致命错误时进行报警
2016/01/19 PHP
Apache无法自动跳转却显示目录的解决方法
2020/11/30 PHP
PHP大文件分割上传 PHP分片上传
2017/08/28 PHP
PHP基于双向链表与排序操作实现的会员排名功能示例
2017/12/26 PHP
struts2+jquery+json实现异步加载数据(自写)
2013/06/24 Javascript
javascript 获取模态窗口的滚动位置代码
2013/08/06 Javascript
使用AngularJS中的SCE来防止XSS攻击的方法
2015/06/18 Javascript
JavaScript实现把数字转换成中文
2015/06/29 Javascript
基于JavaScript实现移动端点击图片查看大图点击大图隐藏
2015/11/04 Javascript
JS+CSS实现闪烁字体效果代码
2016/04/05 Javascript
JavaScript实现Base64编码转换
2016/04/23 Javascript
AngularJS中的表单简单入门
2016/07/28 Javascript
解析ajaxFileUpload 异步上传文件简单使用
2016/12/30 Javascript
JavaScript中的call和apply的用途以及区别
2017/01/11 Javascript
jQuery EasyUI ProgressBar进度条组件
2017/02/28 Javascript
微信通过页面(H5)直接打开本地app的解决方法
2017/09/09 Javascript
详解一个小实例理解js原型和继承
2019/04/24 Javascript
Vue+Element-U实现分页显示效果
2020/11/15 Javascript
Python进程间通信用法实例
2015/06/04 Python
Python实现SMTP发送邮件详细教程
2021/03/02 Python
python实现pdf转换成word/txt纯文本文件
2018/06/07 Python
python实现公司年会抽奖程序
2019/01/22 Python
python中for循环把字符串或者字典添加到列表的方法
2019/07/20 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
2020/06/10 Python
爬虫代理的cookie如何生成运行
2020/09/22 Python
12个不为大家熟知的HTML5设计小技巧
2016/06/02 HTML / CSS
html5借用repeating-linear-gradient实现一把刻度尺(ruler)
2019/09/09 HTML / CSS
英国巧克力贸易公司:Chocolate Trading Company
2017/03/21 全球购物
John Hardy官方网站:手工设计首饰的奢侈品牌
2017/07/05 全球购物
美国演唱会订票网站:Ticketmaster美国
2017/10/05 全球购物
市场营销毕业生自荐信
2013/11/23 职场文书
《唯一的听众》教学反思
2014/02/20 职场文书
小学校园广播稿集锦
2014/10/04 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
用python批量解压带密码的压缩包
2021/05/31 Python
SpringBoot整合minio快速入门教程(代码示例)
2022/04/03 Java/Android