You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ReactJS点击链接URL变更但页面不跳转的问题排查求助

React导航链接URL变化但页面不跳转问题修复

问题描述

点击导航栏链接时,浏览器地址栏URL正常变化,但页面内容未切换;仅手动在URL栏按下回车后,页面才会正确跳转。以下是相关代码及控制台错误截图:

Header组件代码

import React from "react";
import Navbar from "react-bootstrap/Navbar";
import { Nav } from "react-bootstrap";
import "bootstrap/dist/css/bootstrap.min.css";

import {
  HomeRounded,
  SchoolRounded,
  WorkRounded,
  Facebook,
  Twitter,
  LinkedIn,
  GitHub,
  Telegram,
} from "@mui/icons-material";

import { Link, NavLink, withRouter } from "react-router-dom";
import resumeData from "../../utils/resumeData";
import CustomButton from "../Button/Button";
import "./Header.css";

const Header = (props) => {
const pathName = props?.location?.pathname;
console.log(pathName);

return (
<Navbar expand="lg" sticky="top" className="header">
  <Nav.Link as={NavLink} to="/">
    <Navbar.Brand className="header_home">
      <HomeRounded />
    </Navbar.Brand>
  </Nav.Link>

  <Navbar.Toggle />
  <Navbar.Collapse>
    <Nav>
      <Nav.Link
        as={NavLink}
        to="/"
        className={pathName == "/" ? "header_link_active" : "header_link"}>
        Resume
      </Nav.Link>
      <Nav.Link
        as={NavLink}
        to="/portfolio"
        className={
          pathName == "/portfolio" ? "header_link_active" : "header_link"}>
        Portfolio
      </Nav.Link>         
    </Nav>
   </Navbar.Collapse>
 </Navbar>
     );
    };

   export default withRouter(Header);

App.js代码

import React from "react";
import {  BrowserRouter as Router,
   Switch,
   Route,
    Link
} from "react-router-dom";
import {Container, Grid } from "@material-ui/core";

import Profile from "./components/Profile/Profile";
import Header from "./components/Header/Header";
import Portfolio from "./pages/Portfolio/Portfolio";
import Resume from "./pages/Resume/Resume";
import Footer from "./components/Footer/Footer";


 function App() {
 return (
    <Container className={'top_60'}>
      <Grid container spacing={7}>
       <Grid item xs={12} sm={12} md={4} lg={3}>
        <Profile/>
       </Grid>
       <Grid item xs>       
       <Router>
      <Header/>
  
     <Switch>
         <Route path="/portfolio">
           <Portfolio />
         </Route>
         <Route path="/">
           <Resume />
         </Route>
  
       </Switch>
       </Router>
 

        <Footer/>
        </Grid>
     </Grid>
     </Container>
  );
}

export default App;

控制台错误截图

控制台错误


问题分析

从控制台错误可知,你使用的React Router v6已移除withRouter高阶组件,导入并使用该组件会直接报错,导致路由上下文无法正确传递,最终页面无法响应链接点击。此外,Header组件获取路由信息的方式也不符合v6规范。

修复步骤

1. 移除withRouter并改用useLocation钩子

修改Header组件,删除withRouter的导入和导出,改用React Router v6提供的useLocation钩子获取当前路径:

import React from "react";
import Navbar from "react-bootstrap/Navbar";
import { Nav } from "react-bootstrap";
import "bootstrap/dist/css/bootstrap.min.css";

import {
  HomeRounded,
  SchoolRounded,
  WorkRounded,
  Facebook,
  Twitter,
  LinkedIn,
  GitHub,
  Telegram,
} from "@mui/icons-material";

// 移除withRouter导入
import { NavLink } from "react-router-dom";
import resumeData from "../../utils/resumeData";
import CustomButton from "../Button/Button";
import "./Header.css";

// 使用useLocation钩子获取路由信息
import { useLocation } from 'react-router-dom';

const Header = () => {
  const location = useLocation();
  const pathName = location.pathname;
  console.log(pathName);

return (
<Navbar expand="lg" sticky="top" className="header">
  <Nav.Link as={NavLink} to="/">
    <Navbar.Brand className="header_home">
      <HomeRounded />
    </Navbar.Brand>
  </Nav.Link>

  <Navbar.Toggle />
  <Navbar.Collapse>
    <Nav>
      <Nav.Link
        as={NavLink}
        to="/"
        className={pathName == "/" ? "header_link_active" : "header_link"}>
        Resume
      </Nav.Link>
      <Nav.Link
        as={NavLink}
        to="/portfolio"
        className={
          pathName == "/portfolio" ? "header_link_active" : "header_link"}>
        Portfolio
      </Nav.Link>         
    </Nav>
   </Navbar.Collapse>
 </Navbar>
     );
    };

// 移除withRouter包裹
export default Header;

2. 升级路由组件为React Router v6规范(可选但推荐)

React Router v6中Switch已被Routes替代,Route写法也有变化,修改App.js中的路由部分:

import React from "react";
// 替换Switch为Routes
import { BrowserRouter as Router, Routes, Route } from "react-router-dom";
import {Container, Grid } from "@material-ui/core";

import Profile from "./components/Profile/Profile";
import Header from "./components/Header/Header";
import Portfolio from "./pages/Portfolio/Portfolio";
import Resume from "./pages/Resume/Resume";
import Footer from "./components/Footer/Footer";


 function App() {
 return (
   // 将Router移到最外层,确保所有路由相关组件都在上下文内
   <Router>
    <Container className={'top_60'}>
      <Grid container spacing={7}>
       <Grid item xs={12} sm={12} md={4} lg={3}>
        <Profile/>
       </Grid>
       <Grid item xs>       
         <Header/>
         {/* 替换Switch为Routes */}
         <Routes>
             {/* 使用element属性传递组件 */}
             <Route path="/portfolio" element={<Portfolio />} />
             <Route path="/" element={<Resume />} />
         </Routes>
         <Footer/>
        </Grid>
     </Grid>
     </Container>
   </Router>
  );
}

export default App;

3. 验证修复效果

修改完成后重启项目,点击导航链接时,URL变化的同时页面内容会自动切换,无需手动回车。


内容的提问来源于stack exchange,提问作者kudlatiger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:35:21