看我下面的代码。我试图添加这个按钮,使用react-router-dom
返回到上一页,但我得到了下面的错误,并且我的网站上的所有组件都消失了。
错误:
useNavigate() may be used only in the context of a component
我的代码:
function App() {
const navigate = useNavigate();
return (
<BrowserRouter>
<div>
<button onClick={() => navigate(-1)}>go back</button>
<Nav/>
<Routes>
<Route exact path="/" element={<Home/>}/>
<Route exact path="/home" element={<Home/>}/>
<Route exact path="/upcoming/:user" element={<Upcoming/>}/>
<Route exact path="/record/:user" element={<Record/>}/>
<Route path="*" element={<NotFound/>}/>
</Routes>
</div>
</BrowserRouter>
);
}
这是我在控制台中遇到的错误:
6条答案
按热度按时间yzuktlbb1#
此错误会掷回useNavigate。useInRouterContext会检查元件(使用
useNavigate
拦截)是否为<Router>
的子代。下面的源代码解释了为什么不能在
Router
组件之外使用useNavigate
、useLocation
:useNavigate
在底层使用useLocation
,useLocation
将从LocationContext提供器获取位置。如果要获取响应上下文,则应将组件呈现为上下文提供器的后代。Router
组件使用LocationContext.Provider和NavigationContext.Provider。这就是为什么需要将组件呈现为子级的原因。以便useNavigate
挂钩可以从NavigationContext
和LocationContext
提供程序获取上下文数据。您的环境是浏览器,因此需要使用
BrowserRouter
。BrowserRouter
是基于Router
构建的。重构为:
App.jsx
:index.jsx
:vd2z7a6w2#
我在测试一个有钩子
useNavigate
的组件时遇到了同样的问题。通过用Routes
和BrowserRouter
将我的组件 Package 在一个Route
中解决了这个问题。希望这能帮助其他有同样错误的人。ohfgkhjo3#
您使用的是
BrowserRouter
提供程序外部的挂钩。这就是为什么会出现错误。请按如下方式重构您的组件以解决此问题:1dkrff034#
供日后参考:从
react-router-dom
导入<Router>
,从react-router
导入useNavigate
时,也可能出现此错误;uubf1zoe5#
问题
我的错误是
并且仅在运行以下单元测试代码时发生:
溶液
我通过用
<BrowserRouter>
Package 呈现的元素来解决这个错误:dm7nw8vv6#
使用
useNavigate
的组件应使用<Router> ... </Router>
换行例如:
就像这样: