Я работал над этим руководством по React и застрял. (Глава 16: React Router). Все мои базовые шаблонные html-компоненты правильно отображаются в App.js, ПОКА я не завернул некоторые внутренние теги <Routes>
и не добавил атрибуты path = ""
и element = {}
. Код моего файла App.js ниже — это то место, где я сейчас нахожусь (05:00:38 в обучающем видео).
Примечание. Вы сразу заметите, что я уже устранил проблемы и изменил некоторый код, чтобы устранить несоответствия между обучающим видео (которое было сделано в 2021 году) и изменениями, внесенными в 2022 году в React Router 6. Эти изменения включали изменение components
на elements
. , от Switch
до Routes
и т. д. Оглядываясь назад, я понимаю, что мне следовало выбрать более свежий урок, но вот мы здесь...
import Header from './Header';
import Nav from './Nav';
import Footer from './Footer';
import Home from './Home';
import NewPost from './NewPost';
import PostPage from './PostPage';
import About from './About';
import Missing from './Missing';
import { Router, Route, Routes, useHistory } from 'react-router-dom';
import { useState, useEffect } from 'react';
function App() {
return (
<div className = "App">
<Header />
<Nav />
<Routes>
<Route path = "" element = {<Home />} />
<Route path = "post" element = {<NewPost />} />
<Route path = "post/:id" element = {<PostPage />} />
<Route path = "about" element = {<About />} />
<Route path = "*" element = {<Missing />} />
</Routes>
<Footer />
</div>
);
}
export default App;
Кажется, все в порядке, т. е. на Header
рендерятся только Nav
, Home
, Footer
и "localhost:3000"
.
Проблема в том, что когда я захожу в "localhost:3000/post:
, чтобы проверить и посмотреть, будет ли Home
заменено и перерисовано как NewPost
согласно руководству. Вместо этого я получаю пустой экран. Тот же пустой экран появляется, когда я пытаюсь перейти к "localhost:3000/post/:1"
или "localhost:3000/about"
.
Я подозреваю, что проблема кроется где-то в файле App.js выше, моем файле index.js (ниже) или файле NewPost.js (ниже):
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import { BrowserRouter as Router, Route, Routes } from 'react-router-dom';
ReactDOM
.createRoot(document.getElementById('root'))
.render(
<Router>
<Routes>
<Route path = "/" element = {<App />} />
</Routes>
</Router>
);
import React from 'react'
const NewPost = () => {
return (
<main>
<h1>NewPost</h1>
</main>
)
}
export default NewPost
Я искал Stack Overflow и обнаружил несколько похожих проблем, в основном: DOM не отображается при добавлении вложенного маршрута в маршрутизаторе реагирования. Почему это происходит? и response-router-dom <routes> ничего не отображает в localhost:3000. К сожалению, я пока не нашел решения. Несколько человек предложили удалить ключевое слово exact
, что я и сделал, поскольку с тех пор оно было удалено/устарело, но это не помогло. (Эти предыдущие проблемы в конечном итоге были решены путем внесения обновлений синтаксиса React Router 6, которые я отметил в начале своего поста.)
Я загрузил здесь свою полную кодовую базу на случай, если это будет полезно: https://github.com/pudgyturtle/react-blog Я не могу хоть убей понять, в чем проблема.
В React-Router-DOM 6 все маршруты точно совпадают по пути, а рендеринг корневого "/"
маршрута App
не позволяет сопоставлять дочерние маршруты.
Вы можете решить эту проблему, добавив подстановочный знак/splat"*"
к корневому маршруту:
<Route path = "/*" element = {<App />} />
Это позволяет также сопоставлять дочерние маршруты.
Тем не менее, этот корневой маршрут вообще бесполезен, вам нужно просто визуализировать App
непосредственно под BrowserRouter
, и тогда компоненты Routes
и Route
, отображаемые App
, будут работать как маршруты корневого уровня.
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import { BrowserRouter as Router } from 'react-router-dom';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<Router>
<App />
</Router>
);
function App() {
return (
<div className = "App">
<Header />
<Nav />
<Routes>
<Route path = "/" element = {<Home />} />
<Route path = "post" element = {<NewPost />} />
<Route path = "post/:id" element = {<PostPage />} />
<Route path = "about" element = {<About />} />
<Route path = "*" element = {<Missing />} />
</Routes>
<Footer />
</div>
);
}
@pudgyturtle Да, ИМХО, похоже, что онлайн-уроки, как известно, всегда устарели. И да, путь к вашей домашней странице был немного искажен, так и должно быть "/"
, иначе вы могли бы сделать его индексным маршрутом (т. е. без пути, чтобы он соответствовал родительскому маршруту).
В вашем файле index.tsx
это должно выглядеть так:
ReactDOM.createRoot(
document.getElementById('root'))
.render(<App />);
и в вашем App.tsx
это должно выглядеть так:
import Header from './Header';
import Nav from './Nav';
import Footer from './Footer';
import Home from './Home';
import NewPost from './NewPost';
import PostPage from './PostPage';
import About from './About';
import Missing from './Missing';
import { BrowswerRouter as Router, Route, Routes, useHistory } from 'react-router-dom';
import { useState, useEffect } from 'react';
function App() {
return (
<div className = "App">
<Header />
<Nav />
<Router>
<Routes>
<Route path = "" element = {<Home />} />
<Route path = "post" element = {<NewPost />} />
<Route path = "post/:id" element = {<PostPage />} />
<Route path = "about" element = {<About />} />
<Route path = "*" element = {<Missing />} />
</Routes>
</Router>
<Footer />
</div>
);
}
Обратите внимание: я импортировал BrowserRouter as Router
из react-router-dom
.
Похоже, есть небольшая проблема с настройкой маршрутов в вашем приложении React. Вот почему вы видите пустой экран при попытке перейти на определенные страницы.
Измените путь маршрута в App.js:
У вас есть эта строка в вашем App.js:
<Route path = "" element = {<Home />} />
Путь пуст, что может вызвать проблемы. Измените его на / вот так:
<Route path = "/" element = {<Home />} />
В вашем index.js вы оборачиваете свой компонент приложения как маршрутами, так и маршрутами. Вам это не нужно, поскольку вы уже настроили маршруты в App.js. Итак, просто оберните приложение с помощью Router следующим образом:
ReactDOM.createRoot(
document.getElementById('root'))
.render(
<Router>
<App />
</Router>
);
Если у вас по-прежнему возникают проблемы, посмотрите консоль в браузере. Они могут сказать вам, что происходит не так.
Спасибо! Само по себе сопоставление подстановочных знаков не совсем исправило ситуацию (у меня больше не было пустого экрана, но он просто оставался дома, даже когда я перешел к URL-адресу сообщения), но ваш исправленный index.js сделал свое дело. Это кажется намного понятнее, поэтому я начну знакомиться с этим форматом, а не с тем, который описан в руководстве. Еще раз спасибо!!