Маршрутизация не работает

В моем файле App.js я создал маршрутизатор, и у него должна быть страница по умолчанию (Home).

/* eslint-disable jsx-a11y/anchor-is-valid */
import React, { Component } from "react";
import Navigation from "./Pages/Navigation";
import Home from './Pages/Home';
import Footer from './Pages/Footer';
import Projects from './Pages/Projects';
import Contact from './Pages/Contact';
import Policy from './Pages/Privacy';
import 'bootstrap/dist/css/bootstrap.css';
import { BrowserRouter, Route, Routes } from 'react-router-dom';

function App() {
  return (
    <div>
      <Navigation />
      <BrowserRouter>
        <Routes>
          <Route path = "/" exact component = {Home} />
          <Route path = "/home" component = {Home} />
          <Route path = "/Projects" component = {Projects} />
          <Route path = "/Contact" component = {Contact} />
        </Routes>
      </BrowserRouter>

      <br></br>
      <br></br>
      <br></br>
      <Footer />
    </div>
  );
}

export default App;

Home.js

import React, { Component } from 'react';
import 'bootstrap/dist/css/bootstrap.css';
import Carousel from 'react-bootstrap/Carousel';
import { FaPlaneDeparture } from "react-icons/fa";

function Home () {
  return (
    <section className = "relative pb-2">
      <div className='w-full h-[700px] bg-gray-900/90 absolute'>
        <img className='w-full h-full object-cover mix-blend-overlay' src = "https://megax.s3.amazonaws.com/1.png" alt = "airpotimg" />
      </div>

      <div className='max-w-[1240px] mx-auto text-white relative'>
        <center>
          <div className='px-4 py-12 md:block hidden'>
            <div style = {{ display: 'block', width: 800, padding: 30 }}>
              <Carousel>
                <Carousel.Item interval = {4500}>
                  <img src = "https://megax.s3.amazonaws.com/1.png" class = "d-block w-100"></img>
                </Carousel.Item>
                <Carousel.Item interval = {2500}>
                  <img src = "https://megax.s3.amazonaws.com/2.png" class = "d-block w-100"></img>
                </Carousel.Item>
                <Carousel.Item interval = {2500}>
                  <img src = "https://megax.s3.amazonaws.com/3.png" class = "d-block w-100"></img>
                </Carousel.Item>
              </Carousel>
            </div>
            <h2 className='text-3xl pt-8 text-slate-300 uppercase text-center'></h2>
            <h3 className='py-4 text-3xl text-slate-300 text-center'>xxx</h3>
            <p className='py-4 text-3xl text-slate-300 text-center'>
              AWS
            </p>
          </div>
        </center>
      </div>
    </section>
  )
}  

export default Home;

Запуск моего проекта с помощью npm start показывает следующий результат:

Как видите, компонент Home не отображается в качестве маршрута по умолчанию в моем приложении. Фактически, когда я нажимаю на любую другую опцию на панели навигации, ничего не происходит! Похоже, мне что-то не хватает в конфигурации маршрутизатора или методе навигации.

Навигация.js

/* eslint-disable jsx-a11y/anchor-is-valid */
import React, {useState} from 'react'
import { MenuIcon, XIcon } from '@heroicons/react/outline';
import { FaUserAlt, FaSignInAlt } from 'react-icons/fa';

function Navigation() {
  const [nav, setNav] = useState(false)
    
  const handleClick = () => setNav(!nav)

  const handleClose = () => {
    setNav(false);
  };

  return (
    // Navigation bar on large screen
    <div className='w-screen bg-gray-100 h-[70px] z-10 fixed drop-shadow-lg'>
      <div className='px-2 flex justify-between items-center w-full h-full'>
        <div className='flex items-center'>
          <h1 className='text-3xl font-bold text-black mr-4 sm:text-4xl'>Megax</h1>
          <ul className='hidden text-black md:flex'>
            <li className='cursor-pointer hover:bg-white hover:text-green-600 hover:rounded-lg'>
              <a href = "/home">Home</a>
            </li>

            <li className='cursor-pointer relative group hover:bg-white hover:text-green-600 hover:rounded-lg'>
              <a href = "/Projects">Projects</a>
            </li>
        
            <li className='cursor-pointer relative group hover:bg-white hover:text-green-600 hover:rounded-lg'>
              <a href = "/Privacy">Privacy</a>
            </li>
        
            <li className='cursor-pointer relative group hover:bg-white hover:text-green-600 hover:rounded-lg'>
              <a href = "/Contact">Contact</a>
            </li>
          </ul>
        </div>
        <div className='hidden md:flex pr-4'>
          <a
            className = "flex text-center cursor-pointer items-center mx-4 text-black hover:text-green-600"
            type = "submit"
          >
            <FaSignInAlt className='lg:w-5 lg:h-5 mx-2' />
            <span className = "text-sm font-medium">
              Login
            </span>
          </a>

          <a
            className = "block cursor-pointer shrink-0 rounded-lg bg-white p-2.5 border border-gray-100 shadow-sm hover:bg-transparent hover:text-green-600 hover:border hover:border-green-600"
          >
            <span className = "sr-only">Account</span>
            <FaUserAlt className='lg:w-5 lg:h-5' />
          </a>
        </div>

        <div className='md:hidden mr-4' onClick = {handleClick}>
          {!nav
            ? <MenuIcon className='w-5 text-black' />
            : <div className='flex'>
                <a
                  className = "flex text-center cursor-pointer items-center mx-4 text-black hover:text-green-600"
                  type = "submit"
                >
                  <FaSignInAlt className='lg:w-5 lg:h-5 mx-2' />
                  <span className = "text-sm font-medium">
                    Login
                  </span>
                </a>

                <a
                  className = "block cursor-pointer shrink-0 rounded-lg bg-white mr-4 p-2.5 border border-gray-100 shadow-sm hover:bg-transparent hover:text-green-600 hover:border hover:border-green-600"
                >
                  <span className = "sr-only">Account</span>
                  <FaUserAlt className='lg:w-5 lg:h-5' />
                </a>
                <XIcon className='w-5 text-black' /> 
              </div>
          }
        </div>
      </div>

      {/* Navigation on small screens */}
      <ul className = {!nav ? 'hidden' : 'absolute bg-zinc-200 w-full px-8'}>
        <li onClick = {handleClose} className='border-b-2 border-zinc-300 w-full'>
          Home
        </li>

        <li onClick = {handleClose} className='border-b-2 border-zinc-300 w-full'>
          Projects
        </li>

        <li onClick = {handleClose} className='border-b-2 border-zinc-300 w-full'>
          Privacy
        </li>

        <li onClick = {handleClose} className='border-b-2 border-zinc-300 w-full'>
          Contact
        </li>
      </ul>
    </div>
  )
}

export default Navigation

Единственное, в чем я не уверен, является ли это причиной сбоя навигации по страницам через навигационные меню. Я не использовал объект Link в своем навигационном компоненте, как показано ниже:

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

Вместо этого я просто использовал <a href = "/home">Home</a> в меню навигации.

Какую версию React Router вы используете? Это v5?

Hamed Jimoh 27.08.2024 12:18

@HamedJimoh согласно package.json: { "@testing-library/jest-dom": "^5.17.0", "react-dom": "^18.2.0", "react-router-dom": "^ 6.26.1", "react-scripts": "^5.0.1", "web-vitals": "^2.1.4" },

Ani 27.08.2024 13:10

Вы используете response-router-dom v6, но способ рендеринга компонента в маршрутах работает только в v5. Я собираюсь воспроизвести код со своей стороны и исправить ваши маршруты в соответствии с тем, что имеется в версии 6.

Hamed Jimoh 27.08.2024 13:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
1
3
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы используете соглашение о маршрутизации React Router Dom версии 5, но у вас установлена ​​версия React Router Dom — v6. Вот почему ваша навигация не работает должным образом.

В идеале реквизиты exact и component компонентов Route доступны только в версии 5, а не в версии 6. По сути, ваши маршруты не отображают страницы должным образом. Я внес изменения в ваш файл App.js, в котором вы управляете маршрутизацией.

   <div>
      <Navigation />
      <Routes>
        <Route path = "/">
          <Route index element = {<Home />} />
          <Route path = "home" element = {<Home />} />
          <Route
            path = "Projects"
            element = {
              <div style = {{ paddingTop: 150 }}>
                <p>Projects</p>
              </div>
            }
          />
          <Route
            path = "Contact"
            element = {
              <div style = {{ paddingTop: 150 }}>
                <p>Contact</p>
              </div>
            }
          />
        </Route>
      </Routes>
    </div>

Кроме того, я заметил, что вы используете тег привязки <a>...</a> в своем компоненте навигации. Хотя это будет работать с навигацией по страницам, это приведет к обновлению страницы при каждой навигации, а это противоречит цели одностраничного приложения. Теперь я преобразовал все ваши привязки в компонент <Link>...</Link> , предоставленный React Router Dom.

import { useState } from "react";
import { MenuIcon, XIcon } from "@heroicons/react/outline";
import { FaUserAlt, FaSignInAlt } from "react-icons/fa";
import { Link } from "react-router-dom";

function Navigation() {
  const [nav, setNav] = useState(false);

  const handleClick = () => setNav(!nav);

  const handleClose = () => {
    setNav(false);
  };

  return (
    // Navigation bar on large screen
    <div className = "w-screen bg-gray-100 h-[70px] z-10 fixed drop-shadow-lg">
      <div className = "px-2 flex justify-between items-center w-full h-full">
        <div className = "flex items-center">
          <h1 className = "text-3xl font-bold text-black mr-4 sm:text-4xl">
            Megax
          </h1>
          <ul className = "hidden text-black md:flex">
            <li className = "cursor-pointer hover:bg-white hover:text-green-600 hover:rounded-lg">
              <Link to = "/home">Home</Link>
            </li>

            <li className = "cursor-pointer relative group hover:bg-white hover:text-green-600 hover:rounded-lg">
              <Link to = "/Projects">Projects</Link>
            </li>

            <li className = "cursor-pointer relative group hover:bg-white hover:text-green-600 hover:rounded-lg">
              <Link to = "/Privacy">Privacy</Link>
            </li>

            <li className = "cursor-pointer relative group hover:bg-white hover:text-green-600 hover:rounded-lg">
              <Link to = "/Contact">Contact</Link>
            </li>
          </ul>
        </div>
        <div className = "hidden md:flex pr-4">
          <Link
            to = "/login"
            className = "flex text-center cursor-pointer items-center mx-4 text-black hover:text-green-600"
            type = "submit"
          >
            <FaSignInAlt className = "lg:w-5 lg:h-5 mx-2" />
            <span className = "text-sm font-medium">Login</span>
          </Link>

          <Link
            to = "/account"
            className = "block cursor-pointer shrink-0 rounded-lg bg-white p-2.5 border border-gray-100 shadow-sm hover:bg-transparent hover:text-green-600 hover:border hover:border-green-600"
          >
            <span className = "sr-only">Account</span>
            <FaUserAlt className = "lg:w-5 lg:h-5" />
          </Link>
        </div>

        <div className = "md:hidden mr-4" onClick = {handleClick}>
          {!nav ? (
            <MenuIcon className = "w-5 text-black" />
          ) : (
            <div className = "flex">
              <Link
                to = "/login"
                className = "flex text-center cursor-pointer items-center mx-4 text-black hover:text-green-600"
                type = "submit"
              >
                <FaSignInAlt className = "lg:w-5 lg:h-5 mx-2" />
                <span className = "text-sm font-medium">Login</span>
              </Link>

              <Link
                to = "/account"
                className = "block cursor-pointer shrink-0 rounded-lg bg-white mr-4 p-2.5 border border-gray-100 shadow-sm hover:bg-transparent hover:text-green-600 hover:border hover:border-green-600"
              >
                <span className = "sr-only">Account</span>
                <FaUserAlt className = "lg:w-5 lg:h-5" />
              </Link>
              <XIcon className = "w-5 text-black" />
            </div>
          )}
        </div>
      </div>

      {/* Navigation on small screens */}
      <ul className = {!nav ? "hidden" : "absolute bg-zinc-200 w-full px-8"}>
        <li onClick = {handleClose} className = "border-b-2 border-zinc-300 w-full">
          Home
        </li>

        <li onClick = {handleClose} className = "border-b-2 border-zinc-300 w-full">
          Projects
        </li>

        <li onClick = {handleClose} className = "border-b-2 border-zinc-300 w-full">
          Privacy
        </li>

        <li onClick = {handleClose} className = "border-b-2 border-zinc-300 w-full">
          Contact
        </li>
      </ul>
    </div>
  );
}

export default Navigation;

Кроме того, я переместил компонент BrowserRouter, который окружает компонент Routes, в файл index.js (если вы используете create-react-app) или файл main.js (если вы используете Vite) и обертывает его вокруг компонента <App />.

import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import App from "./App.tsx";
import "./index.css";
import { BrowserRouter } from "react-router-dom";

createRoot(document.getElementById("root")!).render(
  <StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </StrictMode>
);

Обертывание BrowserRouter вокруг компонента <App />, который отображает ваш Routes, необходимо для предотвращения ошибки, упомянутой в этом вопросе stackoverflow:

Сообщение об ошибке «Uncaught TypeError: невозможно деструктурировать свойство «базовое имя» React2.useContext(...)», поскольку оно равно нулю»

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

Пока я пытаюсь добавить ссылку на свою страницу «О нас» в NAVBAR, а затем добавляю, что в app.jsx домашняя страница смешивается с ней, и почему-то это немного беспорядочно
Почему React-Router не отображает маршрут, когда я добавляю его путь в конец URL-адреса localhost:3000?
Прокрутите вверх, если изменение маршрута не работает
Как перейти на страницу, нажав на гамбургер-меню?
Перенаправление на главную страницу после входа или регистрации не работает. Firebase, частный маршрут, аутентификация по электронной почте
Защищенный маршрут продолжает перенаправляться на вход после успешного входа в систему
Какова обычная практика вложения маршрутов в отдельные компоненты в React Router 6?
Неожиданная ошибка приложения! 404 не найден в App.js
Navigate против UseNavigate в реагировании на маршрутизатор
Проблема с защищенными маршрутами React, маршрут не переходит от входа в систему к приборной панели