Реагировать - получить параметры из пути маршрута в другом компоненте

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

Итак, у меня есть такая структура приложения:

<BrowserRouter>
  <Menu/>
  <Routes>
    <Route path = "/business/:id" element = {<SomePage />} />
  </Routes>
</BrowserRouter>

В компоненте SomePage я могу использовать useParams и вижу этот id как объект { id: 6 } — это нормально и имеет смысл. Но у меня есть случай, когда мне нужно извлечь этот идентификатор в компоненте Menu и useParams возвращает:

{
  *: "business/6"
}

Но я хотел бы получить объект:

{
  id: 6
}

Я пробовал использовать matchPath, useMatch, useResolvedPath и другие, но особых эффектов не было.

stackoverflow.com/questions/44782774/…matchPath должно работать. Зачем вам нужны несвязанные параметры в меню?
Konrad 16.09.2023 19:19
Поведение ключевого слова "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) для оценки ваших знаний,...
2
1
52
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вам нужно использовать useParams из документации.

Согласно официальной документации маршрутизатора React, крючок useParams может получить доступ только к параметрам Route внутри Routes компонента. Проблема в том, что компонент Menu находится за пределами компонента Routes.

просто оберните компонент <Menu />, как показано ниже, и попробуйте.

<Routes>
    <Route path = "/business/:id" element = {<SomePage />} />
    <Route element = {<Menu />} />
 </Routes>

также см: Получите идентификатор, используя крючок useParams в функциональном компоненте - React Router dom v6

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

Если вы рендерите Menu вне компонента Routes, используйте крючок useMatch, чтобы проверить, есть ли совпадение с путем "/business/:id". Если совпадение есть, то useMatch возвращает объект Match, имеющий свойство params, в противном случае он возвращает значение null (поэтому используйте предложение защиты или проверку нуля перед доступом к возвращаемому значению).

Альтернативно вы можете создать компонент маршрута макета, который отображает Menu вместе с Outlet, визуализировать его внутри компонента Routes и использовать крючок useParams для доступа к объекту params.

Пример:

import { Routes, Route, Outlet, useParams, useMatch } from "react-router-dom";

const MenuStandalone = () => {
  const match = useMatch("/business/:id");

  console.info("MenuStandalone", match?.params);

  return (
    <>
      <h1>MenuStandalone</h1>
      <Outlet />
    </>
  );
};

const MenuLayout = () => {
  const params = useParams();

  console.info("MenuLayout", params);

  return (
    <>
      <h1>MenuLayout</h1>
      <Outlet />
    </>
  );
};

const SomePage = () => {
  const params = useParams();

  console.info("SomePage", params);

  return <h1>SomePage</h1>;
};

export default function App() {
  return (
    <div className = "App">
      <MenuStandalone />

      <Routes>
        <Route element = {<MenuLayout />}>
          <Route path = "/business/:id" element = {<SomePage />} />
        </Route>
      </Routes>
    </div>
  );
}

Спасибо. Ваш ответ имеет смысл. Я боялся, что у меня возникнут проблемы с доступом к useParams компонентам за пределами <Routes>. Проблема с useMatch заключается в том, что мне нужно знать текущий путь, чтобы найти это id, но оно также работает с регулярным выражением: useMatch("/business/:id/*"), так что для /business/6/settings => {*: '/settings', id: "6"} это подойдет.

viko 17.09.2023 11:34

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

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

Доступ к вложенным объектам в JavaScript, где внутренние объекты имеют серийные номера в качестве меток
Модальное окно появляется после второго нажатия кнопки
Совместное использование компонентов между приложениями с помощью машинописного текста и JavaScript
Исключить пакет узла из этапа сборки
VScode не выделяет неиспользуемые переменные серым цветом
Как я могу использовать $uid в правиле безопасности, чтобы пользователи могли впервые писать в коллекцию, не позволяя им перезаписывать данные других пользователей?
Как сделать анимацию формы шеврона в HTML/CSS, как на странице Apple iMac
События, отправленные сервером (SSE), не работают, если выполняются только со статическим сервером nginx
Не могу понять, как использовать оператор if для проверки всех элементов массива с помощью обратного вызова и проверки, все ли они верны
Загрузка ESModule асинхронна?