Как использовать маршрут между тремя компонентами?

У меня есть приложение, разработанное как: App.js, содержащий два маршрута:

  1. Войти Зарегистрироваться
  2. Домашняя страница.

Домашняя страница имеет макет как: Заголовок Боковая панель КонтентАреа

Компонент заголовка и боковой панели импортируются в дом.

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

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

Это мой App.js

function App() {
  return (
    <div className = "App">
      <Routes>
        <Route path = "/" element = {<LoginSignup />} />
        <Route path = "/home" element = {<Home />} />
      </Routes>
    </div>
  );
}

Это мой заголовок:

const Header = () => {
  return (
    <div className='header-container'>
      <div className='header-wrapper'>
        <div className='header-content'>
          <div className='intro-bar'>
            <h3>SideMenu Name</h3>
            <h2>Welcome, User!</h2>
          </div>
          <hr></hr>
        </div>
      </div>
    </div>
  )
}

Это моя боковая панель:

const Sidebar = () => {
  const handleLogout = () => {
    navigate('/');
  }

  return (
    <div className='sidebar-content-menu'>
      <ul className='menu-list'>
        <div>
          <li>Item1</li>
          <li>Item2</li>
          <li>Item3</li>
        </div>
        <div>
          <li onClick = {handleLogout}>Logout</li>
        </div>
      </ul>
    </div>
  )
}

А это мой дом:

const Home = () => {
  const navigate = useNavigate();

  const handleLogout = () => {
    navigate('/');
  }

  return (
    <div className='home-container'>
      <div className='home-wrapper'>
        <div className='home-content'>
          <div className='home-content-side-menu-holder'>
            <h1>ZERO</h1>
            <div className='sidebar-content-menu'>
              <Sidebar />
            </div>
          </div>
          <div className='home-content-menu-content-section'>
            <Header />
            <div className='side-menu-content-section'>
              <div className='side-menu-content-viewer'>
               //i want my sidemenu links page to be displayed here.
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  )
}

На данный момент я удалил

<Routes>
  <Route path = "/home/item1" element = {<Item1 />} />
  <Route path = "/home/item2" element = {<Item2 />} />
  <Route path = "/home/item3" element = {<Item3 />} />
</Routes>

из боковой панели, что привело к ошибкам.

Не могли бы вы уточнить, какую версию react-router вы используете? И когда вы говорите, что «HomePage имеет макет как: ContentArea боковой панели заголовка», вы просто имеете в виду, что у вас есть компонент HomePage с этими тремя дочерними компонентами? Не могли бы вы опубликовать код того, как вы сейчас настроили маршруты?

GregL 05.05.2024 10:28

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

Bibek Bhattarai 05.05.2024 10:31

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

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

Ответы 1

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

Проблема

Проблема в том, что компонент Home отображается на пути маршрута, который не позволяет отображать дочерние маршруты.

Решение

Использование нисходящих маршрутов

Добавьте подстановочный знак "*" в конец пути к домашней странице, чтобы дочерние маршруты также можно было сопоставлять и отображать.

Пример:

Приложение

export default function App() {
  return (
    <div className = "App">
      <Routes>
        <Route path = "/" element = {<LoginSignup />} />
        <Route path = "/home/*" element = {<Home />} />
      </Routes>
    </div>
  );
}

Дочерние маршруты строятся относительно родительского маршрута, поэтому удалите «префикс» "/home" на дочерних маршрутах.

Дом

const Home = () => {
  const navigate = useNavigate();

  const handleLogout = () => {
    navigate("/");
  };

  return (
    <div className = "home-container">
      <div className = "home-wrapper">
        <div className = "home-content">
          <div className = "home-content-side-menu-holder">
            <h1>ZERO</h1>
            <div className = "sidebar-content-menu">
              <Sidebar />
            </div>
          </div>
          <div className = "home-content-menu-content-section">
            <Header />
            <div className = "side-menu-content-section">
              <div className = "side-menu-content-viewer">
                <Routes>
                  <Route path = "/item1" element = {<Item1 />} />
                  <Route path = "/item2" element = {<Item2 />} />
                  <Route path = "/item3" element = {<Item3 />} />
                </Routes>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  );
};

Использование вложенных маршрутов

Другой способ — отрисовать Outlet там, где вы хотите, чтобы маршруты боковой панели отображались, и визуализировать их как вложенные маршруты под "/home".

Приложение

export default function App() {
  return (
    <div className = "App">
      <Routes>
        <Route path = "/" element = {<LoginSignup />} />
        <Route path = "/home" element = {<Home />}>
          <Route path = "item1" element = {<Item1 />} />
          <Route path = "item2" element = {<Item2 />} />
          <Route path = "item3" element = {<Item3 />} />
        </Route>
      </Routes>
    </div>
  );
}

Дом

import { Outlet } from 'react-router-dom';

const Home = () => {
  const navigate = useNavigate();

  const handleLogout = () => {
    navigate("/");
  };

  return (
    <div className = "home-container">
      <div className = "home-wrapper">
        <div className = "home-content">
          <div className = "home-content-side-menu-holder">
            <h1>ZERO</h1>
            <div className = "sidebar-content-menu">
              <Sidebar />
            </div>
          </div>
          <div className = "home-content-menu-content-section">
            <Header />
            <div className = "side-menu-content-section">
              <div className = "side-menu-content-viewer">
                <Outlet />
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
  );
};

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

Похожие вопросы

Как исправить это нежелательное поведение кнопок в ReactJS?
SwiperJs: я показываю группы из двух слайдов, они должны быть центрированы, но я даже не могу этого добиться, ограничивая ширину слайдов
Uncaught TypeError: невозможно прочитать свойства неопределенного типа (чтение «setPopup»)
Ошибка: не удалось найти значение контекста реакции-редукса; убедитесь, что компонент завернут в <Provider> в собственном приложении React Expo
Электронный магазин возвращает «Свойство 'set'/'get' не существует по типу»
Пользовательские фрагменты в AstroJS
Я создал игру «Крестики-нолики». Есть проблема, с которой я столкнулся: всякий раз, когда игра была вничью, она печатает значение счета 2, хотя должно печатать 1
Узлы клонирования DOM Manipulation и размещение значений
Как выполнить скрипт после загрузки компонента в Лит-Элемент
Поповер Bootstrap 5 в адаптивном JS DataTable не работает должным образом