React Router V6 - 错误:useRoutes() 只能在 <Router> 组件的上下文中使用

Gal*_*hus 108 reactjs react-router react-router-dom

我已经安装了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;
Run Code Online (Sandbox Code Playgroud)

The*_*yne 165

您应该在树的较高位置有一个<BrowserRouter>(或任何提供的路由器)。原因是<BrowserRouter>提供了使用 创建路由时需要的历史上下文useRoutes()。请注意,较高意味着它不能位于其<App>本身中,但至少位于呈现它的组件中。

您的入口点可能如下所示:

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


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

Run Code Online (Sandbox Code Playgroud)


Bas*_*den 100

我认为问题在于您仍然需要将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;
Run Code Online (Sandbox Code Playgroud)

根据您的需求进行重构。

  • 我这边缺少“BrowserRouter as Router”。 (9认同)

小智 16

它在您的索引 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"),
);

Run Code Online (Sandbox Code Playgroud)


Sag*_*r M 12

在index.js中提及以下代码

import { BrowserRouter as Router } from "react-router-dom";
Run Code Online (Sandbox Code Playgroud)


小智 8

代码:index.js

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

ReactDOM.render(
  <React.StrictMode>
  <Router>
    <App />
    </Router>
  </React.StrictMode>,
  document.getElementById("root")
);
Run Code Online (Sandbox Code Playgroud)

应用程序.js

function App() {
  return (
  <>
    <Routes>
    <Route path ="/" element={<Main />} />
    <Route path ="gigs" element={<Gigs />} />
    </Routes>
</>
  );
}
Run Code Online (Sandbox Code Playgroud)


小智 6

尝试在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>
);
Run Code Online (Sandbox Code Playgroud)