react-redux中connect的装饰器用法@connect

  最近在琢磨react中的一些小技巧,这篇文章记录一下在redux中用装饰器来写connect。javascript

  一般咱们须要一个reducer和一个action,而后使用connect来包裹你的Component。假设你已经有一个key为main的reducer和一个action.js. 咱们的App.js通常都这么写:java

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嘛,这里必须拿装饰器来装一波啊,稍微改改:react

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,咱们在每一个组件中都这么写,是否是有点太麻烦了?冗余代码太多了。json

  实际上是能够把connect抽取出来的,好比写一个connect.js:redux

import {connect} from 'react-redux'
import {bindActionCreators} from 'redux'
import action from 'action.js'

export default connect(
  state=>state.main,
  dispatch=>bindActionCreators(action,dispatch)
)

  而后在须要用到的组件中这么用:babel

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了,和最开始的用法比起来,是否是明显更装逼更好用?app

  须要说明的是,这里用了装饰器,须要安装模块babel-plugin-transform-decorators-legacy,而后在babel中配置:dom

{
    "plugins":[
        "transform-decorators-legacy"
    ]
}

  若是你用的是vscode, 能够在项目根目录下添加jsconfig.json文件来消除代码警告:spa

{
    "compilerOptions": {
        "experimentalDecorators": true
    }
}

  ok了,到这里真的完了。其实关于connect,是能够继续琢磨的,好比能够写一个通用的connect,全部的模块中全部的组件均可以用的那种,本文就不继续写下去了,之后有机会再写。code

  我一直以为js里面把@ 这玩意儿叫装饰器很差,太难听了,像java那样,叫注解多好。

相关文章
相关标签/搜索