Исключение компонента <Header /> на определенной странице с помощью response-router

Вот рабочий код:

const AppRouter = () => (
<BrowserRouter>
  <div>
    <Header />
    <Switch>
      <Route path = "/" component = {DashboardPage} exact = {true} />
      <Route path = "/:id" component = {ViewerPage} /> // <-- Exclude Header component from this page
      <Route path = "/create" component = {CreatePage} />
      <Route path = "/edit/:id" component = {EditPage} />
      <Route path = "/help" component = {HelpPage} />
      <Route component = {NotFoundPage} />
    </Switch>
  </div>
</BrowserRouter>
);

export default AppRouter;

Я не мог понять, как исключить компонент Header со страницы компонента ViewerPage. Есть какой-либо способ сделать это?

Оберните компонент <Header /> каким-нибудь условием ...

Rayon 14.12.2018 13:47

@Rayon, как бы это выглядело?

netizen0911 14.12.2018 13:48

Что-то вроде URL === SOMETHING ? null : <Header />

Rayon 14.12.2018 13:49

При каких условиях компонент должен появляться / не появляться?

Andy 14.12.2018 13:53

Исключить только на одном конкретном маршруте? {location.pathname !== '/route-to-exclude-header' && <Header />} Если вы хотите исключить более чем один маршрут, создайте массив путей исключения, а затем {exclusionArray.indexOf(location.pathname) > 0 && <Header/>}. Используйте withRouter HoC, предоставляемый пакетом react-router, для внедрения location в ваш компонент.

Kyle Richardson 14.12.2018 13:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
9
5
8 437
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

1- что-то вроде, в Header.js

  import {withRouter} from 'react-router-dom';

        class Header extends Component {
          render() {
            if (this.props.location.pathname === '/') {
              return null
            }
            return (
              // other stuff
            );
          }
        }
  export default withRouter(Header);

Обратите внимание, что withRouter может отличаться в зависимости от версии реагирующего маршрутизатора. Но идея та же: проверьте свой путь с помощью пути ViewerPage и не отображайте заголовок, если это путь ...

2- Другой подход - сделать то же самое с 'redux'

поэтому всякий раз, когда ViewerPage загружается, отправляйте действие. В ViewerPage.js

class ViewerPage extends Component {
          componentDidMount() {
            this.props.updateShouldDisplayHeader(false);
          }
          componentWillUnmount(){
             this.props.updateShouldDisplayHeader(true);
           }
        }

В Header.js

class Header extends Component {
          render() {
            if (!this.props.shouldDisplayHeader) {
               return null;
            }
            return (
              // other stuff
            );
          }
        }

Я полагаю, вы уже знаете, как создавать действия и использовать редукторы на redux

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

Kyle Richardson 14.12.2018 13:58
Ответ принят как подходящий

Компонент высшего порядка withRouter, предоставляемый пакетом react-router, предоставит вам доступ к объекту местоположения. Как только вы это сделаете, вы можете условно отобразить заголовок путем короткого замыкания.

import {withRouter} from 'react-router'

const App = ({location}) => (
  <div>
    {location.pathname !== '/exclusion-path' && <Header/>}
    <Switch>
      ...
    </Switch>
  </div>
)

export default withRouter(App)

или исключить по нескольким путям ...

const exclusionArray = [
  '/path-one',
  '/another-path',
]

const App = ({location}) => (
  <div>
    {exclusionArray.indexOf(location.pathname) < 0 && <Header/>}
    <Switch>
      ...
    </Switch>
  </div>
)

Если вы делаете что-то серьезное, я бы порекомендовал использовать контекстный api и сократить значение, предоставленное контекстом. Если это так, и вам нужно какое-то направление, я буду рад вам это объяснить.

P.S. Если вы хотите сделать это с помощью alpha Hooks API, я буду очень взволнован.

Обновлено: для обращения к commont.

Переместите свой маршрутизатор за пределы компонента приложения.

import {BrowserRouter as Router} from 'react-router-dom'
import ReactDOM from 'react-dom'

ReactDOM.render(
  <Router>
    <App/>
  </Router>,
  document.getElementById('render-target')
)

Вот что я получаю ... Uncaught Error: You should not use <Route> or withRouter() outside a <Router>

netizen0911 14.12.2018 14:36

Переместите ваш <Router/> за пределы компонента приложения. Обратитесь к редактированию.

Kyle Richardson 14.12.2018 14:53

Я пытаюсь использовать контекстный API, имея HeaderConsumer / HeaderProvider с функцией updateHeader для добавления элементов в заголовок, но мне кажется, что я неправильно использую API. Есть предложения @KyleRichardson?

Giraffestock 19.06.2019 18:25

В моем последнем проекте были точно такие же требования, и я решил разделить заголовок на отдельный компонент и использовать фрагменты React. Идиоматический!

import React, { Fragment } from 'react'
// ...

const App = () => (
  <div>
    <Switch>
      <Route path='/no-header-route' component = {NoHeaderComponent} />   // Route without header
      <Fragment>            // This is the key
        <Header/>           // Header is in its own component
        <Route path='/route-1' component = {Comp1}/>  // Route with header
        <Route path='/route-2' component = {Comp2}/>  // Route with header
      </Fragment>
    </Switch>
  </div>
)

Безусловно, это самое элегантное решение! Именно то, что я искал, молодец!

Avius 05.06.2020 14:33

Точно самый элегантный ответ на сложившуюся проблему. Ваш ответ спас мне весь день. Спасибо

Hemadri Dasari 06.04.2021 17:07

Ваш путь - продолжать рендеринг страницы 404 в каждом компоненте. Есть ли способ предотвратить это?

farukbigez 02.05.2021 13:20

Если кто-нибудь читает этот комментарий, я хочу добавить сюда еще один пункт, в моем случае он не работал, если я добавлял <Route path = '/ no-header-route' component = {NoHeaderComponent} /> под закрывающим </Fragment>

Saveen 30.09.2021 18:26

В вашем файле маршрутизатора вызовите useRouteMatch () перед <Switch>

export Routes = (
{useRouteMatch("/specific-route")?.isExact ? (
          <Header />
        ) : null}

<Switch>
  <Route path = "other/path" component = {Other}
  ...
</Switch>
);

В качестве альтернативы вызовите withRouter (), чтобы получить прямой доступ к match, location и history.

export const AuthenticatedRoutes = withRouter(() => (
  {location.pathname !== `/special-url` ? (
    <Header />
  ) : null}

  <Route path = "/special-url" component = {Special}
  <Route path = "/other" component = {Other} 
));

export Routes = (
  {useRouteMatch("/specific-route")?.isExact ? (
    <Header />
  ) : null}
            
  <Switch>
    <Route component = {AuthenticatedRoutes}          
  </Switch>
);
     

Другие вопросы по теме