useLocation() 只能在 Router 组件的上下文中使用
useLocation() may be used only in the context of a Router component
useLocation
当我们尝试在 React Router 中的 Router 上下文之外使用 hook 时,会出现错误“useLocation() may be used only in the context of a Router component” 。
要解决该错误,请useLocation
仅在 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> );
现在你可以useLocation
在你的App.js
文件中使用钩子了。
应用程序.js
import { useLocation, } from 'react-router-dom'; export default function App() { const location = useLocation(); const handleClick = () => { console.log(location); }; return ( <div> <button onClick={handleClick}>Log location</button> </div> ); }
发生错误是因为useLocation
挂钩使用了组件提供的上下文Router
,因此它必须嵌套在Router
.
用组件包装你的 React 应用程序的最佳位置
Router
是在你的index.js
文件中,因为那是你的 React 应用程序的入口点。一旦你的整个应用程序被一个Router
组件包裹起来,你就可以在你的组件中的任何地方使用 React Router 包中的任何钩子。
解决使用Jest测试库报错
如果您在使用 Jest 测试库时遇到错误,解决方案是相同的,您必须将使用钩子的组件包装useLocation
在一个
Router
.
应用程序测试.js
import {render} from '@testing-library/react'; import App from './App'; import {BrowserRouter as Router} from 'react-router-dom'; // 👇️ wrap component that uses useLocation in Router test('renders react component', async () => { render( <Router> <App /> </Router>, ); // your tests... });
发生错误是因为您在测试中呈现的组件或其子组件之一使用了挂钩useLocation
。
您必须将所有使用任何 React Router 钩子的组件包装在一个
Router
组件中,因为它们需要访问
Router
.
我还写了一篇关于
如何在 React Router 中获取当前 URL 和 Route 的文章。