经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » React » 查看文章
解决React报错useNavigate()?may?be?used?only?in?context?of?Router
来源:jb51  时间:2022/12/5 8:48:26  对本文有异议

总览

当我们尝试在react router的Router上下文外部使用useNavigate 钩子时,会产生"useNavigate() may be used only in the context of a Router component"警告。为了解决该问题,只在Router上下文中使用useNavigate 钩子。

下面是一个在index.js文件中将React应用包裹到Router中的例子。

  1. // index.js
  2. import {createRoot} from 'react-dom/client';
  3. import App from './App';
  4. import {BrowserRouter as Router} from 'react-router-dom';
  5. const rootElement = document.getElementById('root');
  6. const root = createRoot(rootElement);
  7. // ??? wrap App in Router
  8. root.render(
  9. <Router>
  10. <App />
  11. </Router>
  12. );

useNavigate

现在,你可以在App.js文件中使用useNavigate钩子。

  1. // App.js
  2. import React from 'react';
  3. import {
  4. useNavigate,
  5. } from 'react-router-dom';
  6. export default function App() {
  7. const navigate = useNavigate();
  8. const handleClick = () => {
  9. // ??? navigate programmatically
  10. navigate('/about');
  11. };
  12. return (
  13. <div>
  14. <button onClick={handleClick}>Navigate to About</button>
  15. </div>
  16. );
  17. }

会发生错误是因为useNavigate钩子使用了Router组件提供的上下文,所以它必须嵌套在Router里面。

用Router组件包裹你的React应用程序的最佳位置是在你的index.js文件中,因为那是你的React应用程序的入口点。

一旦你的整个应用都被Router组件所包裹,你可以随时随地的在组件中使用react router所提供的钩子。

Jest

如果你在使用Jest测试库时遇到错误,解决办法也是一样的。你必须把使用useNavigate钩子的组件包裹在一个Router中。

  1. // App.test.js
  2. import {render} from '@testing-library/react';
  3. import App from './App';
  4. import {BrowserRouter as Router} from 'react-router-dom';
  5. // ??? wrap component that uses useNavigate in Router
  6. test('renders react component', async () => {
  7. render(
  8. <Router>
  9. <App />
  10. </Router>,
  11. );
  12. // your tests...
  13. });

useNavigate钩子返回一个函数,让我们以编程方式进行路由跳转,例如在一个表单提交后。

我们传递给navigate函数的参数与<Link to="/about">组件上的to属性相同。

replace

如果你想使用相当于history.replace()的方法,请向navigate函数传递一个配置参数。

  1. // App.js
  2. import {useNavigate} from 'react-router-dom';
  3. export default function App() {
  4. const navigate = useNavigate();
  5. const handleClick = () => {
  6. // ??? replace set to true
  7. navigate('/about', {replace: true});
  8. };
  9. return (
  10. <div>
  11. <button onClick={handleClick}>Navigate to About</button>
  12. </div>
  13. );
  14. }

当在配置对象中将replace属性的值设置为true时,浏览器历史堆栈中的当前条目会被新的条目所替换。

换句话说,由这种方式导航到新的路由,不会在浏览器历史堆栈中推入新的条目。因此如果用户点击了回退按钮,并不会导航到上一个页面。

这是很有用的。比如说,当用户登录后,你不想让用户能够点击回退按钮,再次回到登录页面。或者说,有一个路由要重定向到另一个页面,你不想让用户点击回退按钮从而再次重定向。

你也可以使用数值调用navigate 函数,实现从历史堆栈中回退的效果。例如,navigate(-1)就相当于按下了后退按钮。

原文链接:bobbyhadz.com/blog/react-…

以上就是解决React报错useNavigate() may be used only in context of Router的详细内容,更多关于React报错useNavigate的资料请关注w3xue其它相关文章!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号