React Router V6 — ошибка: useRoutes () может использоваться только в контексте компонента <Router>

Я установил react-router-domV6-beta. Следуя примеру с веб-сайта, я могу использовать новую опцию useRoutes. Я настроил маршруты страниц и возвращаю их в файл App.js.

После сохранения получаю следующую ошибку:

Ошибка: useRoutes() можно использовать только в контексте компонента.

Мне интересно, если я что-то пропустил здесь? Я создал страницы внутри папки src/pages.

Мой код:

import { BrowserRouter, Link, Outlet, useRoutes } from 'react-router-dom';

// Pages
import Home from './pages/Home';
import About from './pages/About';
import Services from './pages/Services';
import Gallery from './pages/Gallery';
import Prices from './pages/Prices';
import Contact from './pages/Contact';

const App = () => {
    const routes = useRoutes([
        { path: '/', element: <Home /> },
        { path: 'o-nama', element: <About /> },
        { path: 'usluge', element: <Services /> },
        { path: 'galerija', element: <Gallery /> },
        { path: 'cjenovnik', element: <Prices /> },
        { path: 'kontakt', element: <Contact /> }
    ]);

    return routes;
};

export default App;
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
95
0
192 866
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Я думаю, проблема в том, что вам все еще нужно обернуть routes (Routes/useRoutes) внутри элемента Router.

Таким образом, пример будет выглядеть примерно так:

import React from "react";
import {
  BrowserRouter as Router,
  Routes,
  Route,
  useRoutes,
} from "react-router-dom";

const Component1 = () => {
  return <h1>Component 1</h1>;
};

const Component2 = () => {
  return <h1>Component 2</h1>;
};

const App = () => {
  let routes = useRoutes([
    { path: "/", element: <Component1 /> },
    { path: "component2", element: <Component2 /> },
    // ...
  ]);
  return routes;
};

const AppWrapper = () => {
  return (
    <Router>
      <App />
    </Router>
  );
};

export default AppWrapper;

Рефакторинг в соответствии с вашими потребностями.

BrowserRouter as Router, не было на моей стороне.

Florian 15.10.2021 13:47

это означает, что в вашем индексе js или приложение JS обертывается с помощью BrowserRouter, как это

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

ReactDOM.render(
    <React.StrictMode>
        <Provider store = {store}>
            <BrowserRouter>  // Like This here I am using
                <App />
           </BrowserRouter>
       </Provider>
    </React.StrictMode>,
    document.getElementById("root"),
);

Упомяните ниже код в index.js

import { BrowserRouter as Router } from "react-router-dom";
Ответ принят как подходящий

У вас должен быть <BrowserRouter> (или любой из предоставленных маршрутизаторов) выше в дереве. Причина этого в том, что <BrowserRouter> предоставляет контекст истории, который необходим во время создания маршрутов с использованием useRoutes(). Обратите внимание, что более высокий уровень означает, что он не может быть в самом <App>, но, по крайней мере, в компоненте, который его отображает.

Вот как может выглядеть ваша точка входа:

import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';


ReactDOM.render(
  <BrowserRouter>
    <App />
  </BrowserRouter>,
  document.getElementById('root'),
);

Это кажется неверным. github.com/remix-run/react-router/blob/dev/examples/basic/sr‌​c/…

Richard Barraclough 10.03.2023 16:04

Посмотрите основной файл github.com/remix-run/react-router/blob/dev/examples/basic/sr‌​c/…

Dmitry Masley 19.04.2023 15:38

Просто хочу сообщить о похожей проблеме — на момент написания (v6.2.1) кажется, что вы действительно сталкиваетесь с этой ошибкой, если вы импортируете из react-router вместо react-router-dom. Дорогостоящая опечатка с моей стороны.

То есть убедитесь, что вы импортируете Routes и Route из react-router-dom, а НЕ react-router

// This is deceptively valid as the components exist, but is not the intended usage
import { Routes, Route } from 'react-router';

// This works and is the intended usage
import { Routes, Route } from 'react-router-dom';

Как бы смешно это ни казалось, это действительно правильное решение, но мое приложение вылетает из-за этой простой ошибки. Спасибо

Lukman Isiaka 26.03.2022 00:24

Этот. Мой проект отлично работал через React Router версии 6.3.0, но как только я обновился до 6.4.x, бабах. Спасибо за решение очень щекотливой проблемы!

Crates 28.09.2022 23:12

Код: index.js

import {BrowserRouter as Router}  from "react-router-dom";

ReactDOM.render(
  <React.StrictMode>
  <Router>
    <App />
    </Router>
  </React.StrictMode>,
  document.getElementById("root")
);

app.js

function App() {
  return (
  <>
    <Routes>
    <Route path  = "/" element = {<Main />} />
    <Route path  = "gigs" element = {<Gigs />} />
    </Routes>
</>
  );
}
> Following codes works since react-router-dom syntax changed because of React 18.

  import logo from './logo.svg';
    import './App.css';
    import Header from './components/Header';
    import Login from './components/Login';
    import {
      BrowserRouter as Router,
      Routes,
      Route,
      useRoutes,
    } from 'react-router-dom';
    import Signup from './components/Signup';
    
    function AppRoutes() {
      const routes = useRoutes(
        [
          {path:'/',element:<Login/>},
          {path:'/signup',element:<Signup/>}
        ]
      )
      return routes;
    }
    function App(){
      return (
        <Router>
          <Header/>
          <AppRoutes />
        </Router>
      )
    }
    
    export default App;

Пытаться

const Routes = () => useRoutes([]) 

а затем оберните это так в App.js

<BrowserRouter> 
    <Routes />
</BrowserRouter>

Это сработало для меня

Попробуйте добавить свои маршруты в index.js, а не в App.js. Ваш App.js вызывается из index.js. В index.js ваша внешняя страница называется так

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <React.StrictMode>
    <BrowserRouter>
      <Routes>
        <Route path = "/" element = {<Navbar />} />
      </Routes>
    </BrowserRouter>
  </React.StrictMode>
);

Я получил эту ошибку, потому что у меня были две разные версии react-router-dom в комплекте.

Если вы используете рабочие пространства npm/yarn, убедитесь, что в папке node_modules верхнего уровня установлена ​​только одна версия react-router-dom.

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