BrowserRouter上组件的条件渲染

时间:2018-06-06 14:50:41

标签: reactjs react-router

在我的App.js中,我有以下功能:

render() {
  return (
    <div>
      <BrowserRouter>
        <div>
          <Header />
          <Alerts />
          <Switch>
            <Route exact path="/" component={Landing} />
            <Route exact path="/signup" component={Signup} />
            <Route exact path="/login" component={Login} />
            <Route exact path="/profile" component={Profile} />
            <Route path="/:folderName" component={Business} />
          </Switch>
        </div>
      </BrowserRouter>
    </div>
  );
}

我想要做的是渲染组件,仅在前4个路由上,而不是在/:folderName路由中。 我可以将Header放在每个Landing,Signup,Login和Profile路径中,但我觉得必须有更好的方法。我也可以使用render =而不是component = like so:

<Route exact path="/" render={() => (
                  <Fragment>
                    <Header />
                    <Landing />
                  </Fragment>
                )}
/>

但是有更好的方法吗?我可以在要呈现的标题中有条件吗?

由于

1 个答案:

答案 0 :(得分:0)

Antonio Pangallo的评论建议使用HOC确实效果最好。这是我的Switch现在的样子:

render() {
  return (
    <div>
      <BrowserRouter>
        <div>
          <Switch>
            <Route exact path="/" component={withHeaderAndAlerts(Landing)} />
            <Route exact path="/signup" component={withHeaderAndAlerts(Signup)} />
            <Route exact path="/login" component={withHeaderAndAlerts(Login)} />
            <Route exact path="/profile" component={withHeaderAndAlerts(Profile)} />
            <Route path="/:folderName" component={Business} />
          </Switch>
        </div>
      </BrowserRouter>
    </div>
  );
}

使用Header和Alerts包装组件的功能:

//HOC to wrap component in the Header and Alerts components
function withHeaderAndAlerts(WrappedComponent) {
  class withHeaderAndAlerts extends React.Component {
    render() {
      return (
        <Fragment>
          <Header />
          <Alerts />
          <WrappedComponent />
        </Fragment>
      );
    }
  }

  withHeaderAndAlerts.displayName = `withHeaderAndAlerts(${getDisplayName(WrappedComponent)})`;
  return withHeaderAndAlerts;
}

function getDisplayName(WrappedComponent) {
  return WrappedComponent.displayName || WrappedComponent.name || "Component";
}

谢谢安东尼奥!