首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当我点击一个按钮时,我需要转到另一个页面,我正在使用useHistory钩子,但它在React中不能正常工作

在React中使用useHistory钩子进行页面导航时,如果遇到问题,可能是由于以下几个常见原因之一:

  1. React Router版本问题:确保你使用的是React Router v5,因为useHistory在React Router v6中被替换为useNavigate
  2. Router配置问题:确保你的应用程序被Router组件包裹。
  3. 钩子使用问题:确保正确使用useHistory钩子。

以下是一个详细的示例,展示了如何在React Router v5中使用useHistory进行页面导航。

安装React Router

首先,确保你已经安装了React Router:

代码语言:javascript
复制
npm install react-router-dom

配置Router

确保你的应用程序被Router组件包裹。通常,这在你的index.jsApp.js文件中完成。

代码语言:javascript
复制
// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter as Router } from 'react-router-dom';
import App from './App';

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

使用useHistory进行导航

以下是一个示例,展示了如何在组件中使用useHistory进行页面导航。

代码语言:javascript
复制
// App.js
import React from 'react';
import { Route, Switch, useHistory } from 'react-router-dom';

const Home = () => {
  const history = useHistory();

  const handleClick = () => {
    history.push('/about');
  };

  return (
    <div>
      <h1>Home Page</h1>
      <button onClick={handleClick}>Go to About Page</button>
    </div>
  );
};

const About = () => {
  return <h1>About Page</h1>;
};

const App = () => {
  return (
    <Switch>
      <Route exact path="/" component={Home} />
      <Route path="/about" component={About} />
    </Switch>
  );
};

export default App;

解释

  1. Router配置:在index.js中,我们使用<Router>组件包裹了<App>组件,以确保React Router的上下文在整个应用程序中可用。
  2. 定义路由:在App.js中,我们使用<Switch><Route>组件定义了两个路由:/(Home页面)和/about(About页面)。
  3. 使用useHistory进行导航:在Home组件中,我们使用useHistory钩子获取history对象,并在按钮点击时调用history.push('/about')进行页面导航。

React Router v6

如果你使用的是React Router v6,useHistory钩子已被替换为useNavigate。以下是React Router v6的示例:

代码语言:javascript
复制
// App.js
import React from 'react';
import { BrowserRouter as Router, Route, Routes, useNavigate } from 'react-router-dom';

const Home = () => {
  const navigate = useNavigate();

  const handleClick = () => {
    navigate('/about');
  };

  return (
    <div>
      <h1>Home Page</h1>
      <button onClick={handleClick}>Go to About Page</button>
    </div>
  );
};

const About = () => {
  return <h1>About Page</h1>;
};

const App = () => {
  return (
    <Router>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
      </Routes>
    </Router>
  );
};

export default App;

结论

通过上述步骤,你可以在React应用程序中使用useHistory(React Router v5)或useNavigate(React Router v6)进行页面导航。如果你仍然遇到问题,请确保检查以下几点:

  • 确保React Router版本与文档中的示例一致。
  • 确保应用程序被Router组件包裹。
  • 确保正确使用钩子进行导航。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

React Router入门指南(包括Router Hooks)

在本教程将介绍使用React Router入门所需的一切。...在某些情况下,提供这样的路由是完全可以的,请想象一下,当我需要处理真实组件使用render可能不是正确的解决方案。 那么,我们该如何显示一个真实的组件呢?...到目前为止,我们已经做了很多工作,但是,在某些情况下,我们不想使用链接在页面之间导航。 有时,我们必须等待操作完成才能导航到下一页。 让我们在下一部分处理这种情况。...重定向到另一个页面 React Router还有另一个名为Redirect的组件,正如您猜到的,它可以帮助我们将用户重定向到另一个页面。...Router是一个了不起的库,它可以帮助我们从一个页面转到一个页面的应用程序(虽然它仍然是一个页面),并且具有很高的可用性。

12K20
  • 如何更好的在 react使用 axios 的拦截器

    让 axios 基于服务 把 axios 当做服务,那么它在 react 的封装方式将迎刃而解。...在默认页面 DefaultPage 组件,我们可以进行一次错误的请求,请求会返回给我们 404 的状态码,现在我们需要在 axios 中进行拦截,当请求出现 404 ,跳转到 /404 页面。...你现在可以尝试点击默认页按钮,它会进行一个 404 请求,页面将重定向到 /404 页面。...react 的帧数据总是随着执行帧进行变化的,上一帧的数据在下一帧就成为了 过时帧数据,上面说的状态丢失就是使用了过时的帧数据,导致 react 不能正常工作。...axios 的拦截器会在请求开始固定,中途无法修改,这些拦截器会和请求开始所在执行帧的帧数据进行绑定,形成闭包,拦截器是异步的,在一个请求不知道会执行多少帧,这就造成了状态丢失,从而无法正常更新帧数据

    2.6K30

    useTransition真的无所不能吗?🤔

    yarn dev启动前端项目,其大致的页面结果如下: 我们假设B组件是一个「耗时组件」,它在内部渲染了100个小组件,并且每个组件需要花费大约10毫秒来渲染。...理论上来说,渲染100个组件对React来说小菜一碟,架不住每个组件需要10毫秒。那就得到一个糟糕的结果,渲染B页面需要1秒钟。...如果在这期间点击一个Button按钮,该操作导致的「状态更新将被放入任务队列」,在主任务(慢状态更新)完成后执行。..." ..." : ""} ); }; 当我点击B按钮,加载指示器会出现,如果立即点击C,我会立即切换到我们想要展示的页面内容。浏览器没有发生页面卡顿。...如果在B页面上,并点击A Button,首先触发的是初始重新渲染,此时B Button还是选中状态。非常耗时的B组件在重新渲染阻塞了主任务1秒钟。

    40010

    亲手打造属于你的 React Hooks

    的例子使用它与一个复制按钮组件,它接收我们的代码片段的代码。 要做到这一点,我们需要做的就是向按钮添加一个onclick。并在返回一个名为handle的函数,将被请求的代码复制为文本。...在你可以无限滚动的应用,比如微博,一旦用户点击页面底部,你就需要获取更多的帖子。 让我们看看如何自己创建一个 usePageBottom钩子,用于类似的用例,比如创建无限滚动。...为此,我们可以使用一个媒体查询(CSS),或者使用一个自定义的React钩子来提供当前页面的大小,并隐藏或显示JSX的链接。 以前,使用的是一个名为react-use的库钩子。...useDeviceDetect Hook 正在构建一个新的登录页面在移动设备上经历了一个非常奇怪的错误。在台式电脑上,这些样式看起来很棒。...当我着眼于移动平台发现所有内容都是不合适的,并且都是破碎的。 追踪这个问题到一个名为react-device-detect的库,用它来检测用户是否有移动设备。如果是,将删除标题。

    10.1K60

    升级到React-Router-v6_2023-02-28

    这使得 和 的代码更精简、更可预测 路由基于最佳 path 匹配的,而不是按顺序遍历选择的 路由可以嵌套在同一个地方而不必分散在不同的组件 注意: 不能认为...只要使用Route组件则 v6 的Routes组件是必选的, Routes 必须套在最外层才可以使用Route组件,否则会报错。.../list">跳转到list页面 {/* /category/b */} <Link to=".....函数组件可以<em>使用</em><em>useHistory</em>获取history对象,用来做<em>页面</em>跳转导航 // v5 import { <em>useHistory</em> } from '<em>react</em>-router-dom' export...:Detail 点我设置url查询参数为name=jacky ) } 不支持 在老版本<em>中</em>,Prompt组件可以实现<em>页面</em>关闭的拦截,但<em>它在</em> v6 版本还暂不支持,

    2.4K40

    探索React Hooks:原来它们是这样诞生的!

    但是,如果你对React较为陌生,可能会想知道为什么普遍认为应该在React完全避免使用类组件? 主要原因是共享逻辑困难。当我们失去了 mixins ,我们也失去了一种原始的共享代码方式。...下面是一个使用自定义钩子共享数据获取逻辑的示例。你不必完全了解如何使用 useState 和 useEffect ,只需要了解它们为组件执行一些逻辑,想共享它。...如果另一个组件也想根据 productId 获取产品,那么需要重新编写下面高亮的代码: 这里是相同的逻辑移至自定义钩子。...的一些朋友已经使用 React 很长时间了,他们记得这些讨论和权衡。但是注意到(至少在 Twitter 上),历史正在重演。...承认,Hooks 的某些部分比类更难,比如我们可能需要记忆化( useMemo 和 useCallback ),这是一种权衡。

    1.5K20

    React缓存页面」从需求到开源(是怎么样让产品小姐姐刮目相看的)

    如上图所示,当在数万级别的数据,选择一条,点击查看,跳转到当前数据的详情页,当点击按钮返回返回来,或者是浏览器前进后退等其他操作,返回到列表页的时候。要记录当前列表的位置。...也就是要还原点击查看查看前的页面。但是当点击tab菜单按钮的时候,要清除页面信息。 场景二: ?...如上图所示,当我们编辑内容的时候,一些数据可能从其他页面获得,所以要求,无论切换路由,切换页面,当前页面的编辑信息均不能被置空,只有点击确定 ,重置,表单才内容置空。...既然选择缓存页面,那么为什么不在react-router的 Route组件和Switch组件做文章呢,我们需要对Route 和 Switch 组件做一些功能性的拓展,正好笔者之前自己研究过react-router...组件(也就是我们的正常页面)。

    1.8K20

    前端框架「React」 VS 「Svelte」

    会更新显示点击的次数 每次点击 Button ,Button 自身的颜色会跟着变化 首先使用如下命令在你电脑上创建一个新的目录,暂且命名为 svelte-react: mkdir svelte-react...color 表示按钮的颜色,这个值作为一个属性传递给 Button 组件,并且它在每次点击按钮的时候改变。其初始值是 #000000,即为黑色。 count 代表按钮点击的次数,其初始值为 0。...Svelte 提供了一个详细文档来介绍这个问题。 「React」 现在已经引入了 useState 钩子,所以只需要让它工作起来即可。...「状态向上传递」 为了让这个应用正常工作,每次点击按钮,必须让 App 组件的 count 状态值增1。因此需要一个机制来将数据从子组件传递给父组件。...依次点击两个页面按钮,看看效果 「Svelte」 图片 「React」 图片 从运行效果来看,Svelte 和 React 似乎在样式上有点不同,但是功能已经完成了。

    3.5K30

    React vs Svelte

    会更新显示点击的次数 每次点击 Button ,Button 自身的颜色会跟着变化 首先使用如下命令在你电脑上创建一个新的目录,暂且命名为 svelte-react: mkdir svelte-react...color 表示按钮的颜色,这个值作为一个属性传递给 Button 组件,并且它在每次点击按钮的时候改变。其初始值是 #000000,即为黑色。 count 代表按钮点击的次数,其初始值为 0。...Svelte 提供了一个详细文档来介绍这个问题。 「React」 现在已经引入了 useState 钩子,所以只需要让它工作起来即可。...「状态向上传递」 为了让这个应用正常工作,每次点击按钮,必须让 App 组件的 count 状态值增1。因此需要一个机制来将数据从子组件传递给父组件。...依次点击两个页面按钮,看看效果 「Svelte」 图片 「React」 图片 从运行效果来看,Svelte 和 React 似乎在样式上有点不同,但是功能已经完成了。

    3K30

    vue-router 的基本使用和路由守卫

    要想点击home,要想渲染相对应的子组件,那还需要配置一条路由。..., 在router-link to属性就可以使用对象了 //和下面等价 User123 // 当使用对象作为路由的时候,to前面要加一个冒号,表示绑定 User 编程式导航:这主要应用到按钮点击上...当点击按钮的时候,跳转另一个组件, 这只能用代码,调用rourter.push()方法。 当们把router 注入到根实例后,组件通过this....$router.push("home") //就可以跳转到home界面 路由钩子(路由守卫) 在某些情况下,当路由跳转前或跳转后、进入、离开某一个路由前、后,需要做某些操作,就可以使用路由钩子来监听路由的变化...afterEach函数不用传next()函数 这类钩子主要作用于全局,一般用来判断权限,以及以及页面丢失时候需要执行的操作 使用 router.beforeEach 注册一个全局的 before 钩子

    3.1K20

    前端框架 React 和 Svelte 的基础比较

    会更新显示点击的次数 每次点击 Button ,Button 自身的颜色会跟着变化 首先使用如下命令在你电脑上创建一个新的目录,暂且命名为 svelte-react: mkdir svelte-reactcd...color 表示按钮的颜色,这个值作为一个属性传递给 Button 组件,并且它在每次点击按钮的时候改变。其初始值是 #000000,即为黑色。 count 代表按钮点击的次数,其初始值为 0。...Svelte 提供了一个详细文档来介绍这个问题。 React 现在已经引入了 useState 钩子,所以只需要让它工作起来即可。...状态向上传递 为了让这个应用正常工作,每次点击按钮,必须让 App 组件的 count 状态值增1。因此需要一个机制来将数据从子组件传递给父组件。...依次点击两个页面按钮,看看效果。 Svelte React 从运行效果来看,Svelte 和 React 似乎在样式上有点不同,但是功能已经完成了。

    2.2K50

    React-Router-手动路由跳转

    前言手动路由跳转是React Router中一个重要的概念,它允许您在React应用程序通过编程方式控制路由导航,而不是依赖于用户的交互操作。...您将学习如何使用React Router提供的useHistory或useNavigate钩子(或者类似的方法,取决于您的React Router版本)来获取路由导航的函数,并如何在组件内部触发路由跳转...> ) }}export default App;在更改 Discover.js 添加一个按钮按钮点击事件当中...,只有通过路由创建出来的组件才有 history 对象, 所以不能在根组件中使用手动路由跳转,如果一个组件是通过路由创建的, 那么系统就会自动给这个组件传递一个 history 对象,但是如果一个组件不是通过路由创建的...大家点赞支持一下哟~ 正在参与2023腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表图片

    39830

    教你如何在 React 逃离闭包陷阱 ...

    你确实需要在表单中使用它,因此你决定用 React.memo 封装它,以便在表单的状态发生变化时尽量减少它的重新渲染。...当你点击该组件的 "完成" 按钮,就会触发这个回调。如果你想在点击提交表单数据。这也很简单:只需将 title 和 onClick 这两个 props 传递给它即可。...我们刚刚就创建了一个所谓的 "过期闭包"。每个闭包在创建都是冻结的,当我们第一次调用 something 函数,我们创建了一个值变量包含 "first" 的闭包。...我们在 onClick 的值从未更新过,你能告诉为什么吗? 当然,这又是一个过期闭包。当我们创建 onClick ,首先使用默认状态值(undefined)形成闭包。...但我们不能把 ref.current 直接传递给 memoized 组件。每次重新渲染,这个值都会不同, memoization 将无法工作

    61440

    深入了解 useMemo 和 useCallback

    一个组件的重新渲染不会影响另一个组件。 或许你听到很多关于提升状态的说法,但有时,更好的方法是将状态向下推。每个组件应该有一个单独的职责,在上面的例子,App 正在做两件完全不相关的事情。...现在,这并不总是一个选择。在一个大型的现实应用,有许多状态需要向上提升,而不能向下推。对于这种情况,还有另一个妙计。让我们看一个例子。...default React.memo(PrimeCalculator); 我们的 PrimeCalculator 组件现在将始终是纯的,当我们要使用,不需要对它进行修补。...这个按钮大大增加了计数,以防你很匆忙,不想多次点击标准按钮。 多亏了 React.memo, MegaBoost 组件是一个纯组件。它不依赖于计数,每当计数改变它就会重新呈现!...当我构建这样的自定义可重用钩子时,希望使它们尽可能高效,因为不知道将来会在哪里使用它们。在95%的情况下,这可能是多余的,如果使用这个钩子30或40次,这很有可能有助于提高应用程序的性能。

    8.9K30

    react壁纸网站项目开发的一些思路总结

    需求 在壁纸详细页面的右上方显示的是该图片的发布者的基本信息(头像, 昵称, 个人简介), 需要实现的需求是点击用户头像, 跳转到他的个人中心页面....分析 点击头像之后,调用react-router-dom 提供useNavigate钩子 进行路由跳转到个人中心页面, 跳转的时候我们需要将该用户(也就是该作品的发布者的id)带过去,那我们就可以在个人中心页面拿到这个...我们这里需要动态路由, 因为不用 用户中心基本都是一个样子, 我们可以使用一个页面, 而页面内容的展示取决于用户的id, 因为里面的内容都是通过用户id 进行后端接口调用, 返回用户的信息的....如果当前中心页面正好是当前用户的中心页面, 那么就需要在中心页面显示编辑个人信息的按钮 而其他用户的中心页面不显示....以及使用条件判断&&通过条件渲染来实现仅在当前用户中心页面显示编辑按钮的功能.

    9010
    领券