React Router: Как отобразить элемент на всех маршрутах, кроме одного? - PullRequest
1 голос
/ 21 июня 2019

У меня есть такая HTML-структура:

<body>
  <nav>
     <!--navigation elements -->
  </nav>
  <div className='main'>
     <!--other elements -->
  </div>
  <div className='container'></div>
</body>

И маршрутизация определена так:

<Router>
  <Fragment>
    <Navbar />
    <Route exact path="/" component={Landing} />
    <div className="container">
       <Alert />
       <Switch>
           <Route exact path="/register" component={Register} />
           <Route exact path="/login" component={Login} />
           <Route exact path="/profiles" component={Profiles} />
       </Switch>
    </div>
  </Fragment>
</Router>

Элемент "container" присутствует на всех маршрутах, однако я не хочу еговизуализироваться по маршруту "/".

Как я могу остановить рендеринг <div className="container"> на маршруте "/"?Я хочу, чтобы он отображался на всех других маршрутах, кроме "/".

Решение, которое я нашел, но не хочу использовать, заключается в явной вставке элемента с class="container" в каждый отображаемый компонентпо моему <Switch>.Есть ли лучший способ?

Ответы [ 2 ]

1 голос
/ 21 июня 2019

Вы должны быть в состоянии достичь того, что вам нужно, с помощью вложенных маршрутов и "маршрута без совпадения" .

Идея состояла бы в том, чтобы представить структуру вашей маршрутизации через вложенные маршруты, чтобы ограничить рендеринг <div className="container"> не / маршрутов.

Для этого вы можете извлечь компонент (например, WithContainer), который отображает <Route> для путей; /register, /login и /profiles, внутри <div className="container">. Затем вы изменили бы свой <Switch>, чтобы теперь отображать два маршрута для следующих вариантов маршрута;

  1. A <Route/>, который отображает компонент Landing с точным соответствием /
  2. A <Route/>, который отображает ваш новый компонент WithContainer на конкретном маршруте (т. Е. На любом пути, который точно не соответствует /)

При использовании <Switch> таким образом поведение маршрутизации будет отображать либо Landing, либо WithContainer (но не оба) в зависимости от первого соответствующего маршрута. Мы используем это поведение для ограничения рендеринга WithContainer (и, в свою очередь, элемента <div className="container">) для маршрутов "не /".

В коде этот подход может быть выражен как:

const WithContainer = () => (
    <div className="container">
       { /* Wrap routes in container div */ }
       <Route exact path="/register" component={Register} />
       <Route exact path="/login" component={Login} />
       <Route exact path="/profiles" component={Profiles} />
    </div>)

const Main = () => (
  <main> 
    <Switch>
      <Route exact path='/' component={Landing}/>
      <Route component={ WithContainer } /> {/* No match route */ }
    </Switch>
  </main>
)

Надеюсь, это поможет!

0 голосов
/ 21 июня 2019

В последней версии React Router вы можете предоставить массив строк для пропуска path, чтобы определенный маршрут отображался при нескольких совпадениях:

<Route path={['/one', '/two', '/three']} component={SomeComponent} />

Вот ссылка на соответствующую документацию: https://reacttraining.com/react-router/web/api/Route/path-string-string.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...