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

React 路由导航与传参详解

随着单页面应用(SPA)已经成为主流。React 作为最流行的前端框架之一,提供了强大的路由管理工具 react-router-dom,帮助开发者轻松实现页面导航和传参。本文将详细介绍如何使用 react-router-dom 构建路由导航、传参以及嵌套路由的实现。

1. 构建路由导航

1.1 创建路由实例

在 React 项目中,通常会在 src 目录下创建一个 router 文件夹来管理路由。我们可以使用 react-router-dom 提供的 createBrowserRoutercreateHashRouter 方法来创建路由实例。

  • createBrowserRouter:使用 HTML5 的 history API 来实现路由,URL 看起来更干净,例如:http://example.com/home
  • createHashRouter:使用 URL 的 hash 部分来实现路由,例如:http://example.com/#/home
import { createBrowserRouter } from 'react-router-dom';const router = createBrowserRouter([{path: '/',element: <Home />,},{path: '/login',element: <Login />,},{path: '/article',element: <Article />,},
]);export default router;

1.2 嵌套路由

react-router-dom 中,可以通过 children 属性来配置嵌套路由。嵌套路由允许我们在父路由下定义子路由,从而实现更复杂的页面结构。

const router = createBrowserRouter([{path: '/',element: <Layout />,children: [{path: 'home',element: <Home />,},{path: 'about',element: <About />,},],},
]);

1.3 路由导航

在 React 中,有两种主要的方式来实现路由导航:声明式导航编程式导航

1.3.1 声明式导航

使用 <Link> 组件可以实现声明式导航。<Link> 组件会渲染成一个 <a> 标签,点击后会跳转到指定的路由。

import { Link } from 'react-router-dom';const Login = () => {return (<div><h1>登录页</h1><Link to="/article">文章页</Link></div>);
};

- 思考:为啥不用a标签?

  • a标签每次全部刷新页面,并且需要重新挂载组件,对状态(useState登)需要重置;
    每次导航都会重新加载所有资源(如 JavaScript、CSS 等),即使这些资源在前一个页面已经加载过;
    无法直接支持动态路由(如 /user/:id);
  • link标签正好弥补上面缺陷,适合单页面Spa应用。
    自动与路由库(如 React Router)集成,支持浏览器的前进和后退功能,同时更新 URL 和历史记录;
    只有必要的部分(如新路由对应的组件)会被加载,减少了不必要的网络请求和资源消耗;
    点击 组件只会更新当前页面的部分内容(通常是路由对应的组件),而不会重新加载整个页面。这使得无缝地在不同页面之间切换
1.3.2 编程式导航

使用 useNavigate 钩子可以实现编程式导航。useNavigate 返回一个函数,调用该函数并传入目标路径即可实现导航。

import { useNavigate } from 'react-router-dom';const Login = () => {const navigate = useNavigate();return (<div><h1>登录页</h1><button onClick={() => navigate('/article')}>文章页</button></div>);
};

2. 路由传参

在 React 路由中,常见的传参方式有两种:searchParams 传参params 传参

2.1 searchParams 传参

searchParams 传参是通过 URL 的查询字符串来传递参数的。我们可以使用 useSearchParams 钩子来获取和设置查询参数。

import { useNavigate } from 'react-router-dom';const Login = () => {const navigate = useNavigate();return (<div><h1>登录页</h1><button onClick={() => navigate('/article?id=1&name=zs')}>searchParams 传参</button></div>);
};

在目标组件中,可以使用 useSearchParams 来获取传递的参数:

import { useSearchParams } from 'react-router-dom';const Article = () => {const [searchParams] = useSearchParams();const id = searchParams.get('id');const name = searchParams.get('name');return (<div><h1>文章页</h1><p>ID: {id}</p><p>Name: {name}</p></div>);
};

2.2 params 传参

params 传参是通过 URL 的动态段来传递参数的。首先需要在路由配置中定义动态段,然后在导航时传递参数。

2.2.1 路由配置
const router = createBrowserRouter([{path: '/article/:id/:name',element: <Article />,},
]);
2.2.2 导航传参
import { useNavigate } from 'react-router-dom';const Login = () => {const navigate = useNavigate();return (<div><h1>登录页</h1><button onClick={() => navigate('/article/1001/jack')}>params 传参</button></div>);
};
2.2.3 获取参数

在目标组件中,可以使用 useParams 钩子来获取传递的参数:

import { useParams } from 'react-router-dom';const Article = () => {const { id, name } = useParams();return (<div><h1>文章页</h1><p>ID: {id}</p><p>Name: {name}</p></div>);
};

3. 嵌套路由与 <Outlet />

在嵌套路由中,父路由组件需要使用 <Outlet /> 组件作为子路由的占位符。当导航到子路由时,<Outlet /> 会被替换为对应的子路由组件。

import { Outlet } from 'react-router-dom';const Layout = () => {return (<div><h1>布局页</h1><Outlet /></div>);
};

在路由配置中,Layout 组件作为父路由,HomeAbout 作为子路由:

const router = createBrowserRouter([{path: '/',element: <Layout />,children: [{path: 'home',element: <Home />,},{path: 'about',element: <About />,},],},
]);

4. 重定向与 redirect 参数

在某些场景下,用户可能会尝试访问需要登录的页面,但此时用户尚未登录。为了提升用户体验,我们可以在用户登录后将其重定向回原本想要访问的页面。为了实现这一功能,我们可以在 URL 中添加 redirect 查询参数,记录用户原本想要访问的页面。

4.1 添加 redirect 参数

在用户访问需要登录的页面时,我们可以通过编程式导航将用户重定向到登录页面,并在 URL 中添加 redirect 参数,记录原本要访问的页面。

import { useNavigate } from 'react-router-dom';const ProtectedPage = () => {const navigate = useNavigate();const handleAccess = () => {const isLoggedIn = false; // 假设用户未登录if (!isLoggedIn) {navigate(`/login?redirect=${encodeURIComponent('/protected-page')}`);}};return (<div><h1>受保护的页面</h1><button onClick={handleAccess}>访问受保护页面</button></div>);
};

4.2 登录后重定向

在登录页面中,我们可以通过 useSearchParams 获取 redirect 参数,并在用户成功登录后将其重定向回原本想要访问的页面。

import { useSearchParams, useNavigate } from 'react-router-dom';const Login = () => {const [searchParams] = useSearchParams();const navigate = useNavigate();const redirect = searchParams.get('redirect') || '/';const handleLogin = () => {// 假设登录成功navigate(redirect);};return (<div><h1>登录页</h1><button onClick={handleLogin}>登录</button></div>);
};

总结

通过 react-router-dom,我们可以轻松实现 React 应用中的路由导航、传参以及嵌套路由。<Link>useNavigate 提供了灵活的导航方式,而 useSearchParamsuseParams 则帮助我们处理路由传参。<Outlet /> 组件为嵌套路由提供了便捷的占位符功能。此外,通过 redirect 参数,我们可以在用户登录后将其重定向回原本想要访问的页面,从而提升用户体验。掌握这些工具和技巧,能够帮助我们构建更加复杂和高效的单页面应用。

相关文章:

React 路由导航与传参详解

随着单页面应用&#xff08;SPA&#xff09;已经成为主流。React 作为最流行的前端框架之一&#xff0c;提供了强大的路由管理工具 react-router-dom&#xff0c;帮助开发者轻松实现页面导航和传参。本文将详细介绍如何使用 react-router-dom 构建路由导航、传参以及嵌套路由的…...

C#面试常考随笔6:ArrayList和 List的主要区别?

在 C# 中&#xff0c;ArrayList和List<T>&#xff08;泛型列表&#xff09;都可用于存储一组对象。推荐优先使用List<T>&#xff0c;因为它具有更好的类型安全性、性能和语法简洁性&#xff0c;并且提供了更丰富的功能。只有在需要与旧代码兼容或存储不同类型对象的…...

C#分页思路:双列表数据组合返回设计思路

一、应用场景 需要分页查询&#xff08;并非全表查载入物理内存再筛选&#xff09;&#xff0c;返回列表1和列表2叠加的数据时 二、实现方式 列表1必查&#xff0c;列表2根据列表1的查询结果决定列表2的分页查询参数 三、示意图及其实现代码 1.示意图 黄色代表list1的数据&a…...

中科大:LLM检索偏好优化应对RAG知识冲突

&#x1f4d6;标题&#xff1a;RPO: Retrieval Preference Optimization for Robust Retrieval-Augmented Generation &#x1f310;来源&#xff1a;arXiv, 2501.13726 &#x1f31f;摘要 &#x1f538;虽然检索增强生成&#xff08;RAG&#xff09;在利用外部知识方面表现出…...

知识库管理系统提升企业知识价值与工作效率的实践路径分析

内容概要 知识库管理系统在企业发展中的重要性日益凸显&#xff0c;尤其是在信息爆炸的时代。现代企业需要有效地管理和利用自身知识资产&#xff0c;以提升整体效率和竞争力。本文旨在探讨知识库管理系统的应用实践&#xff0c;围绕其在信息整理、知识共享及决策支持等方面的…...

中文输入法方案

使用了三年的自然码双拼&#xff0c;毫无疑问是推荐使用双拼输入法。 三年积累下来的习惯是&#xff1a; 1 自然码方案 2 空格出字 字母选字 直到如今&#xff0c;想要做出改变&#xff0c;是因为这样的方案带来的痛点&#xff1a; 1 使用空格出字就无法使用辅助码&#…...

《AI芯片:如何让硬件与AI计算需求完美契合》

在人工智能飞速发展的今天&#xff0c;AI芯片已成为推动这一领域前行的关键力量。从智能语音助手到自动驾驶汽车&#xff0c;从图像识别技术到复杂的自然语言处理&#xff0c;AI芯片的身影无处不在。它就像是人工智能的“超级大脑”&#xff0c;以强大的计算能力支撑着各种复杂…...

AlertDialog组件的功能与用法

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了Dismissible Widget相关的内容,本章回中将介绍AlertDialog Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们介绍的AlertDialog是指程序中弹出的确认窗口&#xff0c;其实我们在上一章回中删除…...

【Python百日进阶-Web开发-FastAPI】Day813 - FastAPI 响应模型

文章目录 一、返回与输入相同的数据二、添加输出模型三、在文档中查看四、响应模型编码参数4.1 使用 response_model_exclude_unset 参数4.1.1 默认值字段有实际值的数据4.1.2 具有与默认值相同值的数据4.2 response_model_include 和 response_model_exclude4.2.1 使用 list 而…...

洛谷U525376 信号干扰 (判断多个区间是否有重叠)

U525376信号干扰 题目描述 有 n n n 座信号塔&#xff0c;第 i i i 座信号塔的信号将覆盖区间 [ l i , r i ] [l_i,r_i] [li​,ri​]。 若某个点被超过一座信号塔的信号覆盖&#xff0c;则在该点会产生信号干扰。 对于信号塔区间 [ a , b ] [a,b] [a,b]&#xff0c;若建…...

ESP32-S3模组上跑通esp32-camera(35)

接前一篇文章:ESP32-S3模组上跑通esp32-camera(34) 一、OV5640初始化 2. 相机初始化及图像传感器配置 上一回继续对reset函数的后一段代码进行解析。为了便于理解和回顾,再次贴出reset函数源码,在components\esp32-camera\sensors\ov5640.c中,如下: static int reset…...

Java进阶(二):Java设计模式

目录 设计模式 一.建模语言 二.类之间的关系 1.依赖关系 2.关联关系 3.聚合关系 4.组合关系 5.继承关系 6.实现关系 三.面向对象设计原则 单一职责原则 开闭原则 里氏替换原则 依赖倒置 接口隔离原则 迪米特原则 组合/聚合(关联关系)复用原则 四.23种设计模式…...

DeepSeek R1:中国AI黑马的崛起与挑战

文章目录 技术突破&#xff1a;从零开始的推理能力进化DeepSeek R1-Zero&#xff1a;纯RL训练的“自我觉醒”DeepSeek R1&#xff1a;冷启动与多阶段训练的平衡之道 实验验证&#xff1a;推理能力的全方位跃升基准测试&#xff1a;超越顶尖闭源模型蒸馏技术&#xff1a;小模型的…...

抗体人源化服务如何优化药物的分子结构【卡梅德生物】

抗体药物作为一种重要的生物制药产品&#xff0c;已在癌症、免疫疾病、传染病等领域展现出巨大的治疗潜力。然而&#xff0c;传统的抗体药物常常面临免疫原性高、稳定性差以及治疗靶向性不足等问题&#xff0c;这限制了其在临床应用中的效果和广泛性。为了克服这些问题&#xf…...

AndroidCompose Navigation导航精通2-过渡动画与路由切换

目录 前言路由切换NavControllerBackStackEntry过渡动画过渡原理缩放动画渐隐动画滑动动画动画过渡实战前言 在当今的移动应用开发中,导航是用户与应用交互的核心环节。随着 Android Compose 的兴起,它为开发者提供了一种全新的、声明式的方式来构建用户界面,同时也带来了更…...

基于微信小程序的社团活动助手php+论文源码调试讲解

4 系统设计 微信小程序社团微信小程序的设计方案比如功能框架的设计&#xff0c;比如数据库的设计的好坏也就决定了该系统在开发层面是否高效&#xff0c;以及在系统维护层面是否容易维护和升级&#xff0c;因为在系统实现阶段是需要考虑用户的所有需求&#xff0c;要是在设计…...

WebSocket 详解:全双工通信的实现与应用

目录 一、什么是 WebSocket&#xff1f;&#xff08;简介&#xff09; 二、为什么需要 WebSocket&#xff1f; 三、HTTP 与 WebSocket 的区别 WebSocket 的劣势 WebSocket 的常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 一、什么是 WebSocket&#xf…...

漏洞修复:Apache Tomcat 安全漏洞(CVE-2024-50379) | Apache Tomcat 安全漏洞(CVE-2024-52318)

文章目录 引言I Apache Tomcat 安全漏洞(CVE-2024-50379)漏洞描述修复建议升级Tomcat教程II Apache Tomcat 安全漏洞(CVE-2024-52318)漏洞描述修复建议III 安全警告引言 解决方案:升级到最新版Tomcat https://blog.csdn.net/z929118967/article/details/142934649 service in…...

智慧园区系统分类及其在提升企业管理效率中的创新应用探讨

内容概要 智慧园区的概念已经逐渐深入人心&#xff0c;成为现代城市发展中不可或缺的一部分。随着信息技术的飞速发展和数字化转型的不断推进&#xff0c;一系列智慧园区管理系统应运而生。这些系统不仅帮助企业提高了管理效率&#xff0c;还在多个方面激发了创新。 首先&…...

29. 【.NET 8 实战--孢子记账--从单体到微服务】--项目发布

这是本专栏最后一篇文章了&#xff0c;在这片文章里我们不重点讲解如何配置服务器&#xff0c;重点讲如何发布服务&#xff0c;我们开始吧。 一、服务器配置 服务器配置包含&#xff1a;服务器的选择和项目运行环境的配置&#xff0c;下面我们分别来讲解一下。 在服务器选择上…...

SENet实战:如何在PyTorch中实现Squeeze-and-Excitation模块(附完整代码)

PyTorch实战&#xff1a;手把手实现SENet中的SE模块 在计算机视觉领域&#xff0c;注意力机制已经成为提升模型性能的重要工具。今天我们将深入探讨如何在PyTorch中实现Squeeze-and-Excitation&#xff08;SE&#xff09;模块——这个让ResNet-50在ImageNet上表现接近ResNet-10…...

webMAN-MOD终极指南:如何在PS3上安装这款强大的全能插件

webMAN-MOD终极指南&#xff1a;如何在PS3上安装这款强大的全能插件 【免费下载链接】webMAN-MOD Extended services for PS3 console (web server, ftp server, netiso, ntfs, ps3mapi, etc.) 项目地址: https://gitcode.com/gh_mirrors/we/webMAN-MOD 你是否还在为PS3…...

树莓派Pico硬件重置失效?试试这个C语言强制重置方案(附完整代码)

树莓派Pico硬件重置失效&#xff1f;试试这个C语言强制重置方案&#xff08;附完整代码&#xff09; 当你在开发树莓派Pico项目时&#xff0c;可能会遇到这样的情况&#xff1a;硬件重置按钮突然失效&#xff0c;外围设备&#xff08;比如LED&#xff09;无法正常复位。传统的B…...

如何通过炉石传说自动化工具实现游戏效率提升?

如何通过炉石传说自动化工具实现游戏效率提升&#xff1f; 【免费下载链接】Hearthstone-Script Hearthstone script&#xff08;炉石传说脚本&#xff09;&#xff08;2024.01.25停更至国服回归&#xff09; 项目地址: https://gitcode.com/gh_mirrors/he/Hearthstone-Scrip…...

STM32与NB-IoT温室水培系统设计与实现

1. 项目概述与背景这个温室水培系统项目是我去年为一个农业科技园区设计的实际案例&#xff0c;当时客户需要一套能够实现远程监控的智能种植解决方案。经过三个月的开发和调试&#xff0c;最终形成了这套基于STM32和NB-IoT的完整系统。现代温室种植面临几个核心痛点&#xff1…...

WebPages 发布

WebPages 发布 引言 随着互联网技术的飞速发展,Web技术已经成为现代信息社会不可或缺的一部分。WebPages作为Web技术的重要应用,旨在为用户提供高效、便捷的网页浏览体验。本文将详细介绍WebPages的发布过程,包括技术选型、功能设计、性能优化以及用户体验等方面。 技术选…...

PX4无人机Offboard模式实战:从Gazebo仿真到真机避坑指南(附Python/C++代码对比)

PX4无人机Offboard模式全流程实战&#xff1a;从仿真到真机的Python/C双语言开发指南 1. Offboard模式核心原理与开发环境搭建 Offboard模式是PX4飞控系统中最为强大的控制模式之一&#xff0c;它允许开发者通过外部计算机&#xff08;如运行ROS的机载电脑&#xff09;发送精确…...

3个创新特性让开发者解决Linux存储管理难题

3个创新特性让开发者解决Linux存储管理难题 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka 一、诊断存储瓶颈 识别隐形存储占用 当系统提示磁盘空…...

3个高效步骤掌握B站视频下载工具:从解析到批量管理的完整方案

3个高效步骤掌握B站视频下载工具&#xff1a;从解析到批量管理的完整方案 【免费下载链接】bilidown 哔哩哔哩视频解析下载工具&#xff0c;支持 8K 视频、Hi-Res 音频、杜比视界下载、批量解析&#xff0c;可扫码登录&#xff0c;常驻托盘。 项目地址: https://gitcode.com/…...

保姆级教程:在Windows上用Python 3.10.7一键部署SenseVoice语音识别API

Windows平台Python 3.10.7环境下的SenseVoice语音识别API全流程部署指南 语音识别技术正在改变我们与设备交互的方式。对于开发者而言&#xff0c;快速搭建一个可靠的语音识别服务是许多AI应用开发的第一步。SenseVoice作为开源的语音识别解决方案&#xff0c;以其轻量级和易用…...