react dva 的 connect 与 @connect

connect 的使用

dva官方API connecthtml

connect 方法返回的也是一个 React 组件,一般称为容器组件。由于它是原始 UI 组件的容器,即在外面包了一层 Stateconnect 方法传入的第一个参数是 mapStateToProps 函数,该函数须要返回一个对象,用于创建 StateProps 的映射关系。】react

简而言之,connect接收一个函数,返回一个函数。redux

第一个函数会注入所有的models,你须要返回一个新的对象,挑选该组件所须要的modelside

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 的使用

其实只是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',
        })
    }
}
相关文章
相关标签/搜索