深入淺出之React-redux中connect的裝飾器用法@connect

這篇文章主要介紹了react-redux中connect的裝飾器用法@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)
}//歡迎加入前端全棧開發交流圈一起學習交流:864305860
export default connect(mapStateToProps,mapDispatchToProps)(App)

這樣並沒有什麼問題。看着connect的用法,有沒有覺得很熟悉?典型的wrapper嘛,這裏必須拿裝飾器來裝X,稍微改一改:

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>
  }//歡迎加入前端全棧開發交流圈一起學習交流:864305860
}

emmm,這樣舒服很多了,在我們實際項目中,可能是一個模塊下面又有很多個小組件,它們都共用同樣的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)
)//歡迎加入前端全棧開發交流圈一起學習交流:864305860

然後在需要用到的組件中這麼用:

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>
  }
}//歡迎加入前端全棧開發交流圈一起學習交流:864305860

這樣就ok了,和最開始的用法比起來,是不是明顯更裝X更好用?
需要說明的是,這裏用了裝飾器,需要安裝模塊babel-plugin-transform-decorators-legacy,然後在babel中配置:

{
  "plugins":[
    "transform-decorators-legacy"
  ]
}//歡迎加入前端全棧開發交流圈一起學習交流:864305860

如果你用的是vscode, 可以在項目根目錄下添加jsconfig.json文件來消除代碼警告:

{
  "compilerOptions": {
    "experimentalDecorators": true
  }
}//歡迎加入前端全棧開發交流圈一起學習交流:864305860

結語

感謝您的觀看,如有不足之處,歡迎批評指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章