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 attachEvent传递参数的办法
Dec 14 Javascript
28个JS验证函数收集
Mar 02 Javascript
jquery关于图形报表的运用实现代码
Jan 06 Javascript
window.open的页面如何刷新(父页面)上层页面
Dec 28 Javascript
js获取域名的方法
Jan 27 Javascript
js实现做通讯录的索引滑动显示效果和滑动显示锚点效果
Feb 18 Javascript
用node和express连接mysql实现登录注册的实现代码
Jul 05 Javascript
详解Angular5 服务端渲染实战
Jan 04 Javascript
vue-cli开发环境实现跨域请求的方法
Apr 07 Javascript
不得不知的ES6小技巧
Jul 28 Javascript
webpack 3.X学习之多页面打包的方法
Sep 04 Javascript
Javascript异步执行不按顺序解决方案
Apr 30 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数组函数序列之in_array() - 查找数组中是否存在指定值
2011/11/07 PHP
PHP中extract()函数的定义和用法
2012/08/17 PHP
mongo Table类文件 获取MongoCursor(游标)的实现方法分析
2013/07/01 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
php实现大文件断点续传下载实例代码
2019/10/01 PHP
fireworks菜单生成器mm_menu.js在 IE 7.0 显示问题的解决方法
2009/10/20 Javascript
JavaScript写的一个自定义弹出式对话框代码
2010/01/17 Javascript
禁止ajax缓存获取程序最新数据的方法
2013/11/19 Javascript
IE6已终止操作问题的2种情况及解决
2014/04/23 Javascript
JQuery异步获取返回值中文乱码的解决方法
2015/01/29 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
vue实现可增删查改的成绩单
2016/10/27 Javascript
浅谈js对象属性 通过点(.) 和方括号([]) 的不同之处
2016/10/29 Javascript
移动端js图片查看器
2016/11/17 Javascript
详解node服务器中打开html文件的两种方法
2017/09/18 Javascript
JS继承与闭包及JS实现继承的三种方式
2017/10/15 Javascript
使用FormData实现上传多个文件
2018/12/04 Javascript
微信小程序制作表格的方法
2019/02/14 Javascript
Python中生成Epoch的方法
2017/04/26 Python
使用python实现ANN
2017/12/20 Python
Python File readlines() 使用方法
2018/03/19 Python
Python面向对象程序设计之私有属性及私有方法示例
2019/04/08 Python
Python正则表达式匹配数字和小数的方法
2019/07/03 Python
Python 模拟生成动态产生验证码图片的方法
2020/02/01 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
用Python自动清理系统垃圾的实现
2021/01/18 Python
可靠的数据流传输TCP
2016/03/15 面试题
总经理的岗位职责
2014/02/23 职场文书
元旦促销方案
2014/03/15 职场文书
公务员中国梦演讲稿
2014/08/19 职场文书
大学生军训自我鉴定范文
2014/09/18 职场文书
北京离婚协议书范文2014
2014/09/29 职场文书
幼儿园大班见习报告
2014/10/31 职场文书
赤壁观后感(2)
2015/06/15 职场文书
python 下载文件的几种方式分享
2021/04/07 Python