react 理解裝飾器

Pandaaa發表於2018-07-20

說明

  • react 初學者
  • es6 初學者,對裝飾模式有一定了解和使用

react 裝飾器的使用

看看裝飾模式

  • Decorator模式並不嚴重依賴於建立物件的方式,而是關注擴充套件其額外功能。我們使用了一個單一的基本物件並逐步新增提供額外功能的Decorator物件,而不是僅僅依賴於原型繼承。這個想法是:向基本物件新增屬性或者方法,而不是進行子類化 ,因此它較為精簡。

react 在 redux 中使用裝飾器來寫 connect

  • 通常情況下我們需要一個 reducer 和一個 action 來包裹你的 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)
複製程式碼
  • 使用裝飾器@
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 抽離出來

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>
  }
}

複製程式碼

配置一下裝飾器

  • 需要說明的是,這裡用了裝飾器,需要安裝模組babel-plugin-transform-decorators-legacy,然後在babel中配置:
{
  "plugins":[
    "transform-decorators-legacy"
  ]
}
複製程式碼

如果你用的是vscode, 可以在專案根目錄下新增jsconfig.json檔案來消除程式碼警告:

{
  "compilerOptions": {
    "experimentalDecorators": true
  }
}
複製程式碼

實戰篇

相關文章