React-router-dom не отображает компоненты при изменении маршрута

Если я нажимаю ссылку навигации, я вижу, что заголовок изменился, но компонент не отображается. Мне нужно вручную обновить страницу, чтобы увидеть компонент, в то время как страница должна перерисовываться сама по себе при изменении маршрута / слага.

App.js

import React, { Component } from 'react';
import { BrowserRouter, Switch, Route } from 'react-router-dom';
import Me from './components/me';
import Contrib from './components/contrib';
import Projects from './components/projects';
import Contact from './components/contact';

class App extends Component {
  render() {
    return (
      <div className = "container">
        <BrowserRouter>
          <Switch>
            <Route exact path = "/" component = {Me} />
            <Route path = "/contrib" component = {Contrib} />
            <Route path = "/projects" component = {Projects} />
            <Route path = "/contact" component = {Contact} />
          </Switch>
        </BrowserRouter>
      </div>
    );
  }
}

header.jsx

import { BrowserRouter, NavLink} from 'react-router-dom';

const Header = () => {
    return (
        <div className = "container">
            <div id = "logo">
                <img src = {Earth} alt = "placeholdit" className = "rounded" />
            </div>
            <nav>
                <BrowserRouter>
                    <ul>
                        <li><NavLink to = "/">Home</NavLink></li>
                        <li><NavLink to = "/contrib">Contributions</NavLink></li>
                        <li><NavLink to = "/projects">Projects</NavLink></li>
                        <li><NavLink to = "/contact">Contact</NavLink></li>
                        <li></li>
                    </ul>
                </BrowserRouter>
            </nav>
        </div>
    )
}

Если я удалю <BrowserRouter> из header.jsx, я получаю сообщение об ошибке: «Вы не должны использовать <Route> или withRouter() вне <Router>».

Если добавить <BrowserRouter> внутрь header.jsx, ошибка исчезнет, ​​но компоненты не будут отображаться при изменении маршрута / слага.

Как устроен ваш самый верхний компонент? Где вы используете Header и App?

Tholle 27.11.2018 00:07

Я попытался создать приложение с помощью create-react-app и добавил Header в src/index.js -> ReactDOM.render(<Header />, document.getElementById('header'));. Причина, по которой я сделал это, заключается в том, что я не хочу, чтобы весь мой сайт был на <div id = "root"></div>, а скорее имел <header>, <main> and <footer>. App также находится в src/index.js, который генерирует CLI.

Unigazer 27.11.2018 00:10

Ах я вижу. Не могли бы вы отрендерить свой самый верхний компонент, например, в document.body, и самый верхний компонент должен быть, например, <BrowserRouter><Header /><Main /><Footer /></BrowserRouter> вместо этого? Причина, по которой ваш URL-адрес обновляется, а ваши компоненты - нет, заключается в том, что вы используете несколько BrowserRouter.

Tholle 27.11.2018 00:12

Я подозревал, что причина в BrowserRouter, но не был уверен. Попробую, спасибо за подсказку.

Unigazer 27.11.2018 00:13

Ага, теперь работает. Спасибо. Мне пришлось обернуть его в <div>, так как он жалуется, что A <Router> may have only one child element. Итак, вот код, который работает в App.js -> <BrowserRouter> <div> <Header /> <Switch> <Route exact path = "/" component = {Me} /> <Route path = "/contrib" component = {Contrib} /> <Route path = "/projects" component = {Projects} /> <Route path = "/contact" component = {Contact} /> </Switch> </div> </BrowserRouter>

Unigazer 27.11.2018 00:21

Да, и еще одна причина, по которой я избегал помещать все в <div id = "root"></div>, заключается в том, что инструмент аудита из Маяк жалуется на отсутствие тегов <header>, <main> и <footer> в HTML.

Unigazer 27.11.2018 00:24

Возможный дубликат React-router-dom не работает должным образом

Shubham Khatri 27.11.2018 06:34
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
7
7
8 330
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Ответ принят как подходящий

Вам нужно обернуть компонент наивысшего порядка, чтобы он работал должным образом. Если ваше приложение простое, оберните его в метод ReactDOM.render. Вот так

ReactDOM.render((
<BrowserRouter>
  <App/>
</BrowserRouter>),
document.getElementById('root'))

У меня такая же проблема. Удалите файл from header.jsx и поместите его в свой index.js следующим образом:

ReactDOM.render(
    <BrowserRouter>
        <App />
    </BrowserRouter>
, document.getElementById('root'));

Будьте внимательны с порядком из Маршрут, Выключатель и Маршрутизатор. Я следую этому порядку, и он у меня работает. Примечание: Попробуйте использовать функцию стрелки

import React from "react";
import { Switch, Route, Router } from "react-router-dom";
// Containers
import { Dashboard, CardPayment } from "../Containers";

const history = createBrowserHistory();

const ReactRouter = () => {
  return (
    <Router history = {history}>
      <Switch>
        <Route path = "/dashboard" component = {Dashboard} exact = {true} />
        <Route path = "/card-payment" component = {CardPayment} exact = {true} />
        <Route path = "/" component = {Dashboard} exact = {true} />
      </Switch>
    </Router>
  );
};

export default ReactRouter;

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

app.tsx

<Router history = {history}>
  <Switch>
    <Route exact path = {`${AppRoute.ALBUMS}/:author/:album`} component = {PhotosPage}/>
    <Route exact path = {`${AppRoute.ALBUMS}/:id`} component = {AlbumsPage}/>
    <Route path = {AppRoute.ERROR} component = {ErrorPage}/>
    <Route path = {AppRoute.ROOT} component = {AuthorsPage}/>
  </Switch>
</Router>

Версии в моем проекте:

package.json:

...
"history": "4.10.1",
"react-router-dom": "5.2.0",
...

Библиотека "история" изначально имела версию "5.0.0".

<Link to  = {"/home"}>Home</Link>

В моем случае Я забыл добавить скобки к параметру "Кому", значит, это рендеринг компонентов.

он будет работать в обоих направлениях to = "/home" or t0 = {"/home"}

Sarath Kumar 10.06.2021 02:56

Для тех, кто не смог исправить эту ошибку

Шаг 1. Убедитесь, что компонент более высокого порядка обернут маршрутизатором. В вопросе выше это уже сделано.

class App extends Component {
  render() {
    return (
      <div className = "container">
        <BrowserRouter>
          <Switch>
            <Route exact path = "/" component = {Me} />
            <Route path = "/contrib" component = {Contrib} />
            <Route path = "/projects" component = {Projects} />
            <Route path = "/contact" component = {Contact} />
          </Switch>
        </BrowserRouter>
      </div>
    );
  }
}

Давайте рассмотрим, что <Header/> находится внутри любого из компонентов <Route/>.

Шаг 2: Если компонент более высокого порядка уже упакован в Router, не упаковывайте также и <Header/>, если вам не нужна отдельная маршрутизация внутри <Header/>.

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

const Header = () => {
    return (
        <div className = "container">
            <div id = "logo">
                <img src = {Earth} alt = "placeholdit" className = "rounded" />
            </div>
            <nav>
                <ul>
                        <li><NavLink to = "/">Home</NavLink></li>
                        <li><NavLink to = "/contrib">Contributions</NavLink></li>
                        <li><NavLink to = "/projects">Projects</NavLink></li>
                        <li><NavLink to = "/contact">Contact</NavLink></li>
                        <li></li>
                    </ul>
            </nav>
        </div>
    )
}

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