меню рендера рендеринга, когда путь не соответствует

Я использую response-router, и я хочу отображать компонент меню, когда пользователь не находится в корневом каталоге, а не в пути /login. Это то, что я до сих пор

        <Route path="/:subpath" component={TopMenuComponent} />
        <div>
            <Route
                exact path="/"
                render={props => (
                    <LoginContainer {...props} setTitle={this.setTitle} />
                )}
            />               
            <Route path='/landing' component={LandingComponent} />
        </div>

не заботится о том, чтобы не отображать компонент TopMenuComponent в местоположении "/", но как я могу избежать его рендеринга TopMenuComponent, когда пользователь находится в пути/логина? Я всегда мог создать другой компонент и обернуть его, но я думаю, что это слишком много для этого.

Ответы

Ответ 1

React Router сопоставление path strings опирается на [email protected]^1.7.0.

В результате вы можете указать, что routes не должны отображаться для определенных путей, используя regular expressions.

Следующая реализация renders на всех paths, панели "/" и "/login":

<Route path="^(?!.*(/|/login)).*$" component={TopMenuComponent}/>

Ответ 2

Regex на маршруте не работал для меня. Это сработало для меня. Просто добавьте другое условие.

 <Route render={({ location }) => {
     return location.pathname.indexOf('/login') === -1 ? TopMenuComponent : null 
  }} />

Ответ 3

Если вы не хотите использовать регулярные выражения напрямую, вы можете разместить свой логин Route в Switch с верхним компонентом меню Route. Он будет запускать только первый сопоставляемый Route и маршруты, если атрибут пути не соответствует чему-либо.

<div>
    <Switch>
      <Route
          exact path="/"
          render={props => (
              <LoginContainer {...props} setTitle={this.setTitle} />
          )}
      />
      <Route path="/:subpath" component={TopMenuComponent} />
    </Switch>           
    <Route path='/landing' component={LandingComponent} />
</div>

Для вашего примера вам нужно будет изменить порядок своих div.

Ответ 4

Взял Regex от Arman ответа.

const notInLogin = /^(?!.*(\/login)).*$/

export default () => (
  <Router history={history}>
    <>
      <Route path={notInLogin} component={NavBar} />
      <Switch>
        <Route exact path="/login" component={Login} />
        <Route exact path="/accounts" component={Account} />
        <Route exact path="/profile" component={Profile} />
        <Route exact path="/" component={Home} />
      </Switch>
    </>
  </Router>
)

Если вы получили ошибку PropsType: fooobar.com/questions/7287703/...

Ответ 5

Аналогичен ответу Тейлора Мичелса, но следующие маршруты относятся к маршрутам '/login' и '/' (root):

<Route
   render={({ location }) =>
     location.pathname !== "/" && location.pathname !== "/login" ? (
       <TopMenuComponent />
     ) : null
   }
 />>

Это также отображает компонент в виде тега jsx <TopMenuComponent/>, который работает для меня там, где другой подход не сработал.