react dva 的 connect 与 @connect

https://dvajs.com/guide/introduce-class.html#connect-方法html

connect的做用是将组件和models结合在一块儿。将models中的state绑定到组件的props中。并提供一些额外的功能,譬如dispatchide

 

connect 的使用函数

【connect 方法返回的也是一个 React 组件,一般称为容器组件。由于它是原始 UI 组件的容器,即在外面包了一层 State。fetch

connect 方法传入的第一个参数是 mapStateToProps 函数,该函数须要返回一个对象,用于创建 State 到 Props 的映射关系。】ui

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

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

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

其实只是connect的装饰器、语法糖罢了。htm

// 将 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 { // ... }
相关文章
相关标签/搜索