与连接反应无状态组件

时间:2018-06-19 14:23:26

标签: reactjs functional-programming reactive-programming

我想创建一个auth HOC,它将重定向用户或显示组件。

即:

const AuthExtender = props => {
    if (!props.logged) return <Redirect to="/login" />;

    return <WrappedComponent />;
}

const authCompWithState = connect(state=>({logged:state.logged}))(AuthExtender);

我知道这是不对的,但这就是我想要的想法:

const MembersPageForLoggedOnly = memberOnlyPageHOC(MemebersPage);

我尝试了很多版本的返回函数的函数,但是我不能钉住它...

有什么想法吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

我所见过的HOC的通常用法是返回一个类:

const authExtender = WrappedComponent => {
   return class extends Component {
     render() {
       if(!this.props.loggedIn) {
         return <Redirect to={'/login'} />;
       }

       return <WrappedComponent {...this.props} />;
     }
   }
};

然后:

export default authExtender(SomeComponent);

答案 1 :(得分:0)

使用此代码,您可以创建仅具有一个功能的HOC并将其连接到商店。

const membersOnly = WrappedComponent => {
  
  // render redirect if not logged, else component
  const comp = ({ logged, ...props }) => {
    return logged ? <Redirect /> : <WrappedComponent {...props} />
  }

  // connect it to store
  return connect(state => ({logged: state.logged}))(comp)
}

// render
const HomePageMembersOnly = membersOnly(HomePage)

您也可以分开编写。

const membersOnly = WrappedComponent => ({ logged, ...props }) => {
  return logged ? <Redirect /> : <WrappedComponent {...props} />
}

// use it directly
const MembersOnlyHomePage = connect(state => ({logged: state.logged}))(membersOnly(HomePage))

请记住,始终将未使用的props传递给您的WrappedComponent