Переключатель маршрутизатора React ничего не показывает

#javascript #reactjs #react-router-dom

Вопрос:

Я пытаюсь создать веб-сайт в react и использую router-dom для отображения правильного URL-адреса.

У меня есть панель навигации, которая ссылается на страницу о программе, используя ссылку на=»», а затем с помощью переключателя и маршрута для отображения компонента для правильного пути, но это не работает.

Не уверен, что я что-то пропустил здесь, но мне не удается отобразить какие-либо компоненты.

Это мой держатель страницы

 import React from "react";
import { Route, Switch } from "react-router-dom";

import Alphabet from "./Alphabet";
import About from "./About";


export default class PageContainer extends React.Component {
  render() {
    return (
        <section className="pagecontainer">
          <Switch>

            <Route exact path="/omoss">
              <About />
            </Route>
            <Route exact path="/">
              <Alphabet />
            </Route>
          </Switch>
        </section>
    );
  }
}

 

Это моя навигационная панель

 import React from "react";
import { Link } from "react-router-dom";

export default class Navbar extends React.Component {
  render() {
    return (
        <section>
          <section className="navbar">
            <Link to="/">Hem</Link>
            <Link to="/omoss">OM OSS</Link>
          </section>
        </section>
    );
  }
}
 

Обновить:

  • Удалено BrowserRouter из обоих вышеперечисленных компонентов.
  • Изменилось App.js к нижеследующему.

App.js

 import React from "react";
import "./App.css";

import { BrowserRouter } from "react-router-dom";

import Navbar from "./components/Navbar";
import PageContainer from "./components/PageContainer";

function App() {
  return (
    <BrowserRouter>
      <section className="App">
        <Navbar />
        <PageContainer />
      </section>
    </BrowserRouter>
  );
}

export default App;
 

Хотя все еще не работает. URL — адрес меняется, но компоненты не отображаются.

ОБНОВЛЕНИЕ 2

Думаю, я решил эту проблему, когда удалил два других компонента, которые Switch были видны внутри PageContainer , но не были в a Route . Я удалил их перед загрузкой сюда, но забыл их в своем коде

Комментарии:

1. Вам не нужен маршрутизатор в вашей навигационной панели

Ответ №1:

У вас есть два отдельных <BrowserRouter /> компонента, каждый из которых имеет свое собственное состояние. Я предлагаю вам переместить <BrowserRouter /> компонент к общему предку обоих <Navbar /> , <PageContainer /> чтобы они могли совместно использовать один и тот же объект истории.

Например, удалите BrowserRouter из ваших компонентов и поместите его выше в иерархии компонентов. Теперь оба <Navbar /> и <PageContainer /> находятся в сфере одного и того же <BrowserRouter />

 function App() {
  return (
     <BrowserRouter>
        <Navbar />
        <PageContainer />
     </BrowserRouter>
  );
}
 

Комментарии:

1. Ах, я понимаю! Как можно перейти <BrowserRouter /> к компоненту, который можно использовать и из того, и из другого? Как бы это выглядело?

2. Во-вторых, если бы намерение состояло в том, чтобы иметь *вложенные маршруты ,* тогда потребовался бы другой подход, выходящий за рамки вопроса. В противном случае ваш корневой файл (следующий за вашим файлом ввода) будет узлом-предком комментариев, который должен быть завернут в маршрутизатор. Пример: ` const Root = () => ( ><BrowserRouter> <BrowserRouter><Приложение /> <Приложение /></BrowserRouter> ) `

3. Я отредактировал свой ответ с примером того, как этого можно достичь.

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

5. код выглядит нормально с чисто реактивной точки зрения, так что должно быть что-то еще в игре. Какой сервер разработки вы используете? Вы также можете поделиться получаемой ошибкой.

Ответ №2:

Попробуйте добавить BrowserRouter в App.js

 import React from "react";
import "./App.css";
import { BrowserRouter } from "react-router-dom";

import Navbar from "./components/Navbar";
import PageContainer from "./components/PageContainer";

function App() {
  return (
    <BrowserRouter>
      <section className="App">
        <PageContainer />
        <Navbar />
      </section>
    </BrowserRouter>
  );
}

export default App;
 

Комментарии:

1. Затем я получаю эту ошибку: Невозможно использовать Link снаружи Router , если я удалю BrowserRouter

2. Разве ваш Navbar компонент не завернут внутри BrowserRouter ? В каком-то родительском компоненте

3. У меня есть App.js с двумя компонентами Navbar и PageContainer . У второго есть BrowserRouter внутри, но не внутри App.js. Если я перееду Navbar из App.js чтобы внутри BrowserRouter , тогда я мог бы использовать ваш пример выше?

4. Обновил сообщение выше до того, что, как я думаю, вы имеете в виду. Но все еще не показывается. Я добавил BrowserRouter App и удалил его из двух предыдущих компонентов

5. Я обновил свой ответ, в котором обнаружил, в чем проблема, помимо BrowserRouter неправильного использования. Спасибо вам за помощь!