#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
неправильного использования. Спасибо вам за помощь!