useRoutes() 只能在 Router 组件的上下文中使用
useRoutes() may be used only in the context of Router component
useRoutes
当我们尝试在 React Router 中的 Router 上下文之外使用钩子时,会出现错误“useRoutes() may be used only in the context of a Router component” 。
要解决该错误,请useRoutes
仅在 Router 上下文中使用钩子。
Router
这是将 React 应用程序包装在文件中的示例index.js
。
索引.js
import {createRoot} from 'react-dom/client'; import App from './App'; import {BrowserRouter as Router} from 'react-router-dom'; const rootElement = document.getElementById('root'); const root = createRoot(rootElement); // 👇️ wrap App in Router root.render( <Router> <App /> </Router> );
useRoutes
现在您可以在文件中使用该挂钩App.js
。
应用程序.js
import React from 'react'; import { useRoutes } from 'react-router-dom'; export default function App() { let element = useRoutes([ {path: '/', element: <Home />}, {path: '/about', element: <About />}, ]); return element; } function Home() { return <h2>Home</h2>; } function About() { return <h2>About</h2>; }
发生错误的原因是useRoutes
钩子使用了组件提供的上下文
Router
,因此它必须嵌套在Router
.
用组件包装 React 应用程序的最佳位置
Router
是在index.js
文件中,因为那是 React 应用程序的入口点。一旦你的整个应用程序被一个Router
组件包装起来,你就可以在你的组件中的任何地方使用 React Router 包中的任何钩子。
使用组件而不是对象来包装你的路由
钩子useRoutes
的功能相当于Routes
,因此您还可以使用组件而不是对象来定义路由。
应用程序.js
import React from 'react'; import {BrowserRouter as Router, Route, Link, Routes} from 'react-router-dom'; export default function App() { return ( <Router> <div> <nav> <ul> <li> <Link to="/">Home</Link> </li> <li> <Link to="/about">About</Link> </li> </ul> </nav> {/* 👇️ Wrap your Route components in a Routes component */} <Routes> <Route path="/about" element={<About />} /> <Route path="/" element={<Home />} /> </Routes> </div> </Router> ); } function Home() { return <h2>Home</h2>; } function About() { return <h2>About</h2>; }
React 路由器使用简化的路径格式,其中<Route path>
有 2 种占位符:
- 动态
:id
参数 *
通配符
通配符*
语法只能用在路径末尾。
应用程序.js
import React from 'react'; import {BrowserRouter as Router, Route, Link, Routes} from 'react-router-dom'; import {useParams} from 'react-router-dom'; export default function App() { return ( <Router> <div> <nav> <ul> <li> <Link to="/">Home</Link> </li> <li> <Link to="/about">About</Link> </li> <li> {/* 👇️ link to dynamic path */} <Link to="/users/4200">Users</Link> </li> <li> {/* 👇️ link to catch all route */} <Link to="/does-not-exist">Catch all route</Link> </li> </ul> </nav> {/* 👇️ Wrap your Route components in a Routes component */} <Routes> <Route path="/about" element={<About />} /> {/* 👇️ handle dynamic path */} <Route path="/users/:userId" element={<Users />} /> <Route path="/" element={<Home />} /> {/* 👇️ only match this when no other routes match */} <Route path="*" element={ <div> <h2>404 Page not found etc</h2> </div> } /> </Routes> </div> </Router> ); } function Home() { return <h2>Home</h2>; } function About() { return <h2>About</h2>; } function Users() { const params = useParams(); return <h2>Users: {params.userId}</h2>; }
该路由<Route path="/users/:userId" element={<Users />} />
使用动态
userId
参数,我们可以使用useParams
钩子访问该动态参数。
该路线将匹配 后的任何内容/users/
,例如/users/123
或
/users/asdf
。
路径等于 的路由用作*
包罗万象的路由。它仅在没有其他路由匹配时才匹配。
更多示例请参考
react router的官方文档页面。
我还写了一份关于
如何处理 React Router 中未找到的 404 页面的详细指南。