首页
学习
活动
专区
工具
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秒钟。

    42710

    亲手打造属于你的 React Hooks

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

    10.1K60

    React 侧边栏组件 Sidebar

    容器负责定义侧边栏的整体布局和样式,而内容则包含具体的菜单项或功能按钮等。在React中,我们可以通过创建一个名为Sidebar的组件来封装这些逻辑。...(二)状态管理侧边栏的状态(如是否展开、当前选中的菜单项等)是需要动态管理的。我们可以使用React的内置状态管理工具——useState钩子来处理这些状态。例如,控制侧边栏的展开与收起。...我们使用了useState来跟踪侧边栏的打开/关闭状态,并通过按钮点击事件切换状态。...然而,如果不正确配置路由,可能会导致页面跳转异常或丢失状态。确保在设置路由时遵循最佳实践,例如使用useHistory或useNavigate钩子(根据React Router版本)来处理导航逻辑。...我们通过在父级容器上添加一个点击事件监听器,并使用event.target.closest('li')来查找被点击的菜单项,从而实现了事件委托。

    20310

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

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

    1.9K20

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

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

    1.6K20

    前端框架「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.6K30

    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腾讯技术创作特训营第二期有奖征文,瓜分万元奖池和键盘手表图片

    44730

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

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

    9610

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

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

    68940
    领券