dva官方API connecthtml
【connect
方法返回的也是一个 React 组件,一般称为容器组件。由于它是原始 UI 组件的容器,即在外面包了一层 State
。connect
方法传入的第一个参数是 mapStateToProps
函数,该函数须要返回一个对象,用于创建 State
到 Props
的映射关系。】react
简而言之,connect
接收一个函数,返回一个函数。redux
第一个函数会注入所有的models
,你须要返回一个新的对象,挑选该组件所须要的models
。ide
export default connect(({ user, login, global = {}, loading }) => ({ currentUser: user.currentUser, collapsed: global.collapsed, fetchingNotices: loading.effects['global/fetchNotices'], notices: global.notices }))(BasicLayout); // 简化版 export default connect( ({ user, login, global = {}, loading }) => { return { currentUser: user.currentUser, collapsed: global.collapsed, fetchingNotices: loading.effects['global/fetchNotices'], notices: global.notices } } )(BasicLayout);
其实只是connect
的装饰器、语法糖罢了。函数
// 将 model 和 component 串联起来 export default connect(({ user, login, global = {}, loading }) => ({ currentUser: user.currentUser, collapsed: global.collapsed, fetchingNotices: loading.effects['global/fetchNotices'], notices: global.notices, menuData: login.menuData, // by hzy redirectData: login.redirectData, // by hzy }))(BasicLayout);
// 改成这样(export 的再也不是connect,而是class组件自己。),也是能够执行的,但要注意@connect必须放在export default class前面: // 将 model 和 component 串联起来 @connect(({ user, login, global = {}, loading }) => ({ currentUser: user.currentUser, collapsed: global.collapsed, fetchingNotices: loading.effects['global/fetchNotices'], notices: global.notices, menuData: login.menuData, // by hzy redirectData: login.redirectData, // by hzy })) export default class BasicLayout extends React.PureComponent { // ... }
@
是es7
加入的功能,如今已经有不少项目开始使用fetch
修饰器是一个对类进行处理的函数。修饰器函数的第一个参数,就是所要修饰的目标类。ui
例如在你之前的react
项目中,用了react-redux
你是这么写connect
的:this
const mapStateToProps = state => { return { user: state.user.user }; }; const mapDispatchToProps = (dispatch) => ({ usersAction: bindActionCreators(userAction, dispatch), dispatch: dispatch }); export default connect(mapStateToProps, mapDispatchToProps)(Header);
那么如今用上es7
的修饰器,你能够改为这样:spa
@connect(state => ({ user: state.user.user, }), dispatch => ({ ...bindActionCreators({ usersAction: usersAction }, dispatch) }) ) export default class Main extends Component { }
固然,若是你用dva
或者redux-saga
,你甚至不用在connect
里写dispatch
,能够这么写code
@connect(state => ({ user: state.user.user, }), ) export default class Main extends Component { componentDidMount () { this.props.dispatch({ type: 'user/saveUser', }) } }