假设咱们在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