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 相关文章推荐
脚本安需导入(装载)的三种模式的对比
Jun 24 Javascript
jQuery操作select的实例代码
Jun 14 Javascript
js键盘上下左右键怎么触发function(实例讲解)
Dec 14 Javascript
Javascript中For In语句用法实例
May 14 Javascript
AngularJS基础 ng-focus 指令简单示例
Aug 01 Javascript
bootstrap-Treeview实现级联勾选
Nov 23 Javascript
详解Nuxt.js Vue服务端渲染摸索
Feb 08 Javascript
基于vue v-for 多层循环嵌套获取行数的方法
Sep 26 Javascript
vue通信方式EventBus的实现代码详解
Jun 10 Javascript
解决在layer.open中使用时间控件laydate失败的问题
Sep 11 Javascript
vue插槽slot的简单理解与用法实例分析
Mar 14 Javascript
element中Steps步骤条和Tabs标签页关联的解决
Dec 08 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 xml 入门学习资料
2011/01/01 PHP
wamp下修改mysql访问密码的解决方法
2013/05/07 PHP
PHP删除数组中空值的方法介绍
2014/04/14 PHP
PHP添加文字水印或图片水印的水印类完整源代码与使用示例
2019/03/18 PHP
javascript 中对象的继承〔转贴〕
2007/01/22 Javascript
js获取图片长和宽度的代码
2009/11/24 Javascript
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
基于JavaScript实现瀑布流效果(循环渐近)
2016/01/27 Javascript
AngularJS上拉加载问题解决方法
2016/05/23 Javascript
JS Canvas定时器模拟动态加载动画
2016/09/17 Javascript
微信小程序  wx.request合法域名配置详解
2016/11/23 Javascript
详解NodeJs支付宝移动支付签名及验签
2017/01/06 NodeJs
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
js for终止循环 跳出多层循环
2018/10/04 Javascript
玩转Koa之koa-router原理解析
2018/12/29 Javascript
vue 解决文本框被键盘遮住的问题
2019/11/06 Javascript
Python 16进制与中文相互转换的实现方法
2018/07/09 Python
pycharm 实现显示project 选项卡的方法
2019/01/17 Python
python增加图像对比度的方法
2019/07/12 Python
python 动态调用函数实例解析
2019/10/21 Python
python3.6、opencv安装环境搭建过程(图文教程)
2019/11/05 Python
python中seaborn包常用图形使用详解
2019/11/25 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
使用Keras实现Tensor的相乘和相加代码
2020/06/18 Python
意大利在线药房:Farmacia Loreto Gallo
2019/08/09 全球购物
New Balance法国官方网站:购买鞋子和服装
2019/09/01 全球购物
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
家具促销活动方案
2014/02/16 职场文书
委托书范本
2014/04/02 职场文书
出国留学担保书
2014/05/20 职场文书
党员对照检查剖析材料
2014/10/13 职场文书
2014年图书室工作总结
2014/12/09 职场文书
亲属关系公证书样本
2015/01/23 职场文书
大学军训通讯稿
2015/07/18 职场文书
学校2016年九九重阳节活动总结
2016/04/01 职场文书
将MySQL的表数据全量导入clichhouse库中
2022/03/21 MySQL