当前位置: 首页 > news >正文

React 中获取当前路由信息

在 React 中获取当前路由信息,根据使用的路由库不同(如 React Router v5/v6 或 Next.js),方法也有所区别。以下是常见场景的解决方案:


1. 使用 React Router v6

获取当前路径(pathname)、查询参数(search)等
import { useLocation, useParams, useSearchParams } from 'react-router-dom';function MyComponent() {// 获取路径信息(如 /users/123?name=foo)const location = useLocation();console.log(location.pathname); // "/users/123"console.log(location.search);   // "?name=foo"// 获取动态路由参数(如 /users/:id)const params = useParams();console.log(params.id); // "123"// 获取查询参数(URLSearchParams 对象)const [searchParams] = useSearchParams();console.log(searchParams.get('name')); // "foo"return <div>Current Path: {location.pathname}</div>;
}
获取路由匹配信息
import { useMatch } from 'react-router-dom';// 检查当前路由是否匹配某个路径
const match = useMatch('/users/:id');
if (match) {console.log(match.params.id); // 动态参数
}

2. 使用 React Router v5

获取路由信息
import { useLocation, useParams, useRouteMatch } from 'react-router-dom';function MyComponent() {const location = useLocation();const params = useParams();const match = useRouteMatch();console.log(location.pathname); // 当前路径console.log(params);            // 动态参数console.log(match.url);         // 匹配的URLreturn <div>Current Route: {location.pathname}</div>;
}
类组件中获取路由
import { withRouter } from 'react-router-dom';class MyComponent extends React.Component {render() {const { location, match, params } = this.props;return <div>Path: {location.pathname}</div>;}
}export default withRouter(MyComponent);

3. 在 Next.js 中获取路由

Pages Router(传统方式)
import { useRouter } from 'next/router';function MyComponent() {const router = useRouter();// 获取完整路由信息console.log(router.pathname); // "/posts/[id]"console.log(router.query);    // { id: "123" }(动态参数 + 查询参数)console.log(router.asPath);   // "/posts/123?name=foo"(浏览器显示的实际路径)return <div>Current Page: {router.pathname}</div>;
}
App Router(Next.js 13.4+)
// 在 Server Component 中
import { usePathname, useSearchParams } from 'next/navigation';export default function Page() {const pathname = usePathname();       // "/dashboard"const searchParams = useSearchParams(); // URLSearchParams 对象return <div>Path: {pathname}</div>;
}

4. 获取当前路由的额外场景

获取路由的 basename
// React Router v6
import { useMatches } from 'react-router-dom';
const matches = useMatches();
console.log(matches[0].pathname); // 包含 basename 的完整路径// Next.js (需手动处理)
const basePath = process.env.NEXT_PUBLIC_BASE_PATH || '';
监听路由变化
// React Router
useEffect(() => {const unlisten = history.listen((update) => {console.log('Route changed to:', update.location.pathname);});return unlisten; // 清理监听
}, []);// Next.js
useEffect(() => {router.events.on('routeChangeComplete', (url) => {console.log('Route changed to:', url);});
}, [router]);

5. 常见问题解决

问题:路由信息未更新
  • 原因:组件未被路由上下文包裹。
  • 解决:确保组件在 <BrowserRouter><Router> 内部:
    // 根组件中
    import { BrowserRouter } from 'react-router-dom';
    ReactDOM.render(<BrowserRouter><App /></BrowserRouter>,document.getElementById('root')
    );
    
问题:Next.js 中 router.query 初始为空
  • 原因:静态优化导致首次渲染时无参数。
  • 解决:添加加载状态判断:
    if (!router.isReady) return <div>Loading...</div>;
    

总结:按需选择方法

场景推荐 API示例
React Router v6useLocation, useParamsconst { pathname } = useLocation()
React Router v5withRouter, useRouteMatchexport default withRouter(MyComponent)
Next.js Pagesnext/routerconst router = useRouter()
Next.js App Routernext/navigationconst pathname = usePathname()
获取查询参数useSearchParams (React Router)const [params] = useSearchParams()
监听路由变化history.listen 或 Next.js 事件router.events.on('routeChangeComplete', ...)

根据你的路由库选择对应方法即可准确获取当前路由信息!

http://www.lryc.cn/news/603163.html

相关文章:

  • 低空经济应用-无人机拉格朗日粒子追踪技术
  • 界面控件Telerik UI for WPF 2025 Q2亮点 - 重要组件全新升级
  • SeeMoE:从零开始实现一个MoE视觉语言模型
  • CentOS Nginx 1.13.9 部署文档
  • 14 - 大语言模型 — 抽取式问答系统 “成长记”:靠 BERT 学本事,从文本里精准 “揪” 答案的全过程(呆瓜版-1号)
  • 分布式链路追踪详解
  • 【C++】第十九节—一文万字详解 | AVL树实现
  • 【C++篇】“内存泄露”的宝藏手段:智能指针
  • 【腾讯云】EdgeOne免费版实现网站加速与安全防护
  • thingsboard 自定义动作JS编程
  • uniapp 如果进入页面输入框自动聚焦,此时快速返回页面或者跳转到下一个页面,输入法顶上来的页面出现半屏的黑屏问题。
  • 在 Ubuntu 下测试单目与双目相机
  • 影翎Antigravity将发布全球首款全景无人机,8月开启公测招募
  • python案例:基于python 神经网络cnn和LDA主题分析的旅游景点满意度分析
  • JAVA第五学:方法的使用
  • 实时画面回传的开发复盘
  • 【LeetCode 热题 100】34. 在排序数组中查找元素的第一个和最后一个位置——二分查找
  • Linux之网络部分-应用层协议 HTTP
  • Objective-c 初阶——异常处理(try-catch)
  • 第2章算法分析:大O符号的定义和性质
  • 第17章——多元函数积分学的预备知识
  • golang--通道和锁
  • springboot集成deepseek
  • c++: 尾置返回类型(Trailing Return Type)
  • 【MySQL基础篇】:MySQL常用数据类型的选择逻辑与正确使用
  • 前段面试题新版
  • 【分布式版本控制系统】Git的使用
  • 完整复现cacti的RCE
  • 【Python】自动化GIT提交
  • Linux:线程同步与线程互斥