假設咱們在react中有以下header組件:javascript
import React, { PureComponent } from 'react'; import { connect } from 'react-redux'; import actions from './actions'; class Header extends PureComponent{ render(){ return ( <div>這是個組件</div> ) } } const mapStateToProps = state => ({ todos:state.todos }) const mapDispatchToProps = dispatch => ({ setTodos:value=>dispatch(actions.setTodos(value)) }) export default connect(mapStateToProps,mapDispatchToProps)(Header)
咱們在寫react組件時結合redux要定義mapStateToProps和mapDispatchToProps兩個返回對象的純函數以便交給connect去包裹使用 具體connect使用查看connecthtml
這裏咱們就能夠用裝飾器(Decorator)來改寫下:java
import React, { PureComponent } from 'react'; import { connect } from 'react-redux'; import actions from './actions'; @connect( state=>({ todos:state.todos }), dispatch=>({ setTodos:value=>dispatch(actions.setTodos(value)) }) ) class Header extends PureComponent{ render(){ return ( <div>這是個組件</div> ) } } export default Header
如此,改造完成,代碼看上去也比改造前的乾淨整潔了react
可是因爲裝飾器的兼容性問題咱們須要使用babel來轉換shell
// 安裝babel插件 yarn add @babel/plugin-proposal-decorators
修改package.json下的babeljson
"babel": { "presets": [ "react-app" ], "plugins": [ [ "@babel/plugin-proposal-decorators", { "legacy": true } ] ] },
最後一步
根目錄下新建jsconfig.json解決編輯器報錯問題redux
{ "compilerOptions": { "experimentalDecorators": true } }
而後就能夠愉快的coding了api