@Artem641

Почему react router не видит айдишник в урле?

Всем привет.
react-router-dom 6
Есть такой набор путей:
<Routes>
      <Route path="/" element={<MainPage />} />

      <Route path="/posts">
        <Route path="" element={<Posts />} />
        <Route path=":postId" element={<PostIdPage />} />
      </Route>

      <Route path="/about" element={<About />} />
      <Route path="*" element={<Error />} />
    </Routes>


Все пути работают. Но когда я переношу пути в константу (в отдельный файл, на случай если путей будет много) роутер не видит postId. Другие пути при этом отрабатывают нормально.
Константа:
export const routes = [
  { path: '/', element: MainPage },
  { path: '/posts', element: Posts },
  { path: '/posts/:postId', element: PostIdPage },
  { path: '/about', element: About },
  { path: '/*', element: Error },
]

{routes.map((r, index) => (
        <Route key={index} path={r.path} element={r.element()} />
      ))}


Саму константу мапим, и получаем те же пути. Но роут для конкретного id не работает. Я сначала думал, что может сам компонент path не так выводит, и проверил это выводом в консоль - путь правильный, но роутер все равно не видит id. Как это можно пофиксить?
  • Вопрос задан
  • 152 просмотра
Пригласить эксперта
Ответы на вопрос 1
Mike_Ro
@Mike_Ro
Python, JS, WordPress, SEO, Bots, Adversting
React Router 6 слегка иначе обрабатывается динамические роуты, попробуйте так:
export const routes = [
  { path: '/', element: <MainPage /> },
  { 
    path: '/posts', 
    element: <Posts />,
    children: [
      { path: ':postId', element: <PostIdPage /> }
    ]
  },
  { path: '/about', element: <About /> },
  { path: '/*', element: <Error /> },
]

const renderRoutes = (routes) => {
  return (
    <Routes>
      {routes.map((route, index) => (
        <Route key={index} path={route.path} element={route.element}>
          {route.children && renderRoutes(route.children)}
        </Route>
      ))}
    </Routes>
  );
};

export default function App() {
  return (
    <div>
      {renderRoutes(routes)}
    </div>
  );
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы