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 相关文章推荐
js语法学习之判断一个对象是否为数组
May 13 Javascript
JavaScript通过元素索引号删除数组中对应元素的方法
Mar 18 Javascript
javascript文本模板用法实例
Jul 31 Javascript
jQuery实现点击小图显示大图代码分享
Aug 25 Javascript
jQuery继承extend用法详解
Oct 10 Javascript
Vue.js实现列表清单的操作方法
Nov 15 Javascript
Vue调试神器vue-devtools安装方法
Dec 12 Javascript
解决vue中无法动态修改jqgrid组件 url地址的问题
Mar 01 Javascript
解决LayUI表单获取不到data的问题
Aug 20 Javascript
微信小程序 (地址选择1)--选取搜索地点并显示效果
Dec 17 Javascript
基于javascript canvas实现五子棋游戏
Jul 08 Javascript
vue 实现锚点功能操作
Aug 10 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
smarty中先strip_tags过滤html标签后truncate截取文章运用
2010/10/25 PHP
浅析PHP中的字符串编码转换(自动识别原编码)
2013/07/02 PHP
Prototype最新版(1.5 rc2)使用指南(1)
2007/01/10 Javascript
(function(){})()的用法与优点
2007/03/11 Javascript
javascript prototype 原型链
2009/03/12 Javascript
js 页面关闭前的出现提示的实现代码
2011/05/25 Javascript
关于JS控制代码暂停的实现方法分享
2012/10/11 Javascript
setInterval()和setTimeout()的用法和区别示例介绍
2013/11/17 Javascript
详解JavaScript的while循环的使用
2015/06/03 Javascript
js实现网站最上边可关闭的浮动广告条代码
2015/09/04 Javascript
jquery实现鼠标点击后展开列表内容的导航栏效果
2015/09/14 Javascript
jQuery多个版本和其他js库冲突的解决方法
2016/08/11 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
2017/02/08 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
2018/01/18 Javascript
详释JavaScript执行环境与执行栈
2019/04/02 Javascript
浅谈小程序globalData的那些事儿
2019/11/01 Javascript
Vue实现计算器计算效果
2020/08/17 Javascript
antd中table展开行默认展示,且不需要前边的加号操作
2020/11/02 Javascript
Python写的一个简单监控系统
2015/06/19 Python
Python结巴中文分词工具使用过程中遇到的问题及解决方法
2017/04/15 Python
Python基础教程之浅拷贝和深拷贝实例详解
2017/07/15 Python
Python实现GUI学生信息管理系统
2020/04/05 Python
用Python实现大文本文件切割的方法
2019/01/12 Python
Python文本处理简单易懂方法解析
2019/12/19 Python
Django 多对多字段的更新和插入数据实例
2020/03/31 Python
Django数据库操作之save与update的使用
2020/04/01 Python
用python实现前向分词最大匹配算法的示例代码
2020/08/06 Python
Anaconda详细安装步骤图文教程
2020/11/12 Python
利用CSS3的transform做的动态时钟效果
2011/09/21 HTML / CSS
TOWER London官网:鞋子、靴子、运动鞋等
2019/07/14 全球购物
三严三实对照检查材料
2014/09/22 职场文书
小学班主任个人总结
2015/03/03 职场文书
情况说明书怎么写
2015/10/08 职场文书
护士岗前培训心得体会
2016/01/08 职场文书
教你使用pyinstaller打包Python教程
2021/05/27 Python
Unity连接MySQL并读取表格数据的实现代码
2021/06/20 MySQL