? 最近在琢磨react中的一些小技巧和悦,這篇文章記錄一下在redux中用裝飾器來寫connect。
? 通常我們需要一個reducer和一個action榜揖,然后使用connect來包裹你的Component勾哩。假設(shè)你已經(jīng)有一個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了粪躬,到這里真的完了担败。其實關(guān)于connect,是可以繼續(xù)琢磨的镰官,比如可以寫一個通用的connect提前,所有的模塊中所有的組件都可以用的那種,本文就不繼續(xù)寫下去了泳唠,以后有機(jī)會再寫狈网。
? 我一直覺得js里面把@
這玩意兒叫裝飾器不好,太難聽了笨腥,像java那樣孙援,叫注解多好。