Почему React-Router не отображает маршрут, когда я добавляю его путь в конец URL-адреса localhost:3000?

Я работал над этим руководством по 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

Проблема в том, что когда я захожу в "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 Я не могу хоть убей понять, в чем проблема.

Поведение ключевого слова "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) для оценки ваших знаний,...
1
0
50
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

В 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>
  );
}

Спасибо! Само по себе сопоставление подстановочных знаков не совсем исправило ситуацию (у меня больше не было пустого экрана, но он просто оставался дома, даже когда я перешел к URL-адресу сообщения), но ваш исправленный index.js сделал свое дело. Это кажется намного понятнее, поэтому я начну знакомиться с этим форматом, а не с тем, который описан в руководстве. Еще раз спасибо!!

pudgyturtle 15.08.2024 17:40

@pudgyturtle Да, ИМХО, похоже, что онлайн-уроки, как известно, всегда устарели. И да, путь к вашей домашней странице был немного искажен, так и должно быть "/", иначе вы могли бы сделать его индексным маршрутом (т. е. без пути, чтобы он соответствовал родительскому маршруту).

Drew Reese 15.08.2024 17:42

В вашем файле 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>
);

Если у вас по-прежнему возникают проблемы, посмотрите консоль в браузере. Они могут сказать вам, что происходит не так.

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