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那樣,叫註解多好。

相關文章
相關標籤/搜索