Я установил react-router-dom
V6-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;
Я думаю, проблема в том, что вам все еще нужно обернуть 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;
Рефакторинг в соответствии с вашими потребностями.
это означает, что в вашем индексе 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/src/…
Посмотрите основной файл github.com/remix-run/react-router/blob/dev/examples/basic/src/…
Просто хочу сообщить о похожей проблеме — на момент написания (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';
Как бы смешно это ни казалось, это действительно правильное решение, но мое приложение вылетает из-за этой простой ошибки. Спасибо
Этот. Мой проект отлично работал через React Router версии 6.3.0, но как только я обновился до 6.4.x, бабах. Спасибо за решение очень щекотливой проблемы!
Код: 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
.
BrowserRouter as Router,
не было на моей стороне.