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 相关文章推荐
一些常用弹出窗口/拖放/异步文件上传等实用代码
Jan 06 Javascript
jquery批量控制form禁用的代码
Aug 06 Javascript
js判断undefined类型示例代码
Feb 10 Javascript
面向切面编程(AOP)的理解
May 01 Javascript
Javascript中判断对象是否为空
Jun 10 Javascript
充分发挥Node.js程序性能的一些方法介绍
Jun 23 Javascript
JS JSOP跨域请求实例详解
Jul 04 Javascript
jquery中关于bind()方法的使用技巧分享
Mar 30 jQuery
JS中将多个逗号替换为一个逗号的实现代码
Jun 23 Javascript
ReactNative列表ListView的用法
Aug 02 Javascript
基于jQuery Ajax实现下拉框无刷新联动
Dec 06 jQuery
vue使用map代替Aarry数组循环遍历的方法
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
Flash空降上海 化身大魔王接受挑战
2020/03/02 星际争霸
PHP实践教程之过滤、验证、转义与密码详解
2017/07/24 PHP
CI框架(CodeIgniter)公共模型类定义与用法示例
2017/08/10 PHP
thinkphp5 URL和路由的功能详解与实例
2017/12/26 PHP
Ext JS 4官方文档之三 -- 类体系概述与实践
2012/12/16 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
JQuery右键菜单插件ContextMenu使用指南
2014/12/19 Javascript
JavaScript实现使用Canvas绘制图形的基本教程
2016/10/27 Javascript
Bootstrap弹出框(Popover)被挤压的问题小结
2017/07/11 Javascript
浅谈vue-lazyload实现的详细过程
2017/08/22 Javascript
探索webpack模块及webpack3新特性
2017/09/18 Javascript
详解vue-cli 本地开发mock数据使用方法
2018/05/29 Javascript
vue interceptor 使用教程实例详解
2018/09/13 Javascript
基于js判断浏览器是否支持webGL
2020/04/18 Javascript
Python单例模式实例分析
2015/01/14 Python
python实现矩阵乘法的方法
2015/06/28 Python
django 发送手机验证码的示例代码
2018/04/25 Python
pygame游戏之旅 添加键盘按键的方法
2018/11/20 Python
【python】matplotlib动态显示详解
2019/04/11 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
浅析Windows 嵌入python解释器的过程
2019/07/26 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
2021/02/02 Python
Notino意大利:购买香水和化妆品
2018/11/14 全球购物
接口的多继承会带来哪些问题
2015/08/17 面试题
值传递还是引用传递
2015/02/08 面试题
《蜗牛》教学反思
2014/02/18 职场文书
理工学院学生自我鉴定
2014/02/23 职场文书
环保小标语
2014/06/13 职场文书
供电工程专业求职信
2014/08/09 职场文书
2015年百日安全活动总结
2015/03/26 职场文书
观看建国大业观后感
2015/06/01 职场文书
导游词之山西-五老峰
2019/10/07 职场文书
七年级话题作文之执着
2019/11/19 职场文书
详解Python中__new__方法的作用
2022/03/31 Python
python获取字符串中的email
2022/03/31 Python
Python+SeaTable实现计算两个日期间的工作日天数
2022/07/07 Python