React 从入门到生产(六):路由与导航

React+TypeScript:现代化前端路由导航系统开发详解 高效的路由导航系统是现代单页应用的关键组成部分。通过实现细粒度监听、优先级控制和便捷的导航API,可以大大提高应用的性能和开发效率。本文介绍的增强型路由系统适合复杂的企业级应用,尤其是那些需要精细路由控制的场景,如数据分析平台、管理系统等。通过合理应用这些模式和工具,你可以构建出更加灵活、高效的前端路由系统,为用户提供流畅的导航体验。 阅读详情

创作者: Yardon  |  GitHub: github.com/YardonYan  |  版本: v1.0


单页应用的 URL 问题

传统的多页网站,每个页面有自己的 URL。你在浏览器地址栏输入 /about,服务器就返回 about.html,每一页都是完整独立的一次往返。

React 做的单页应用(SPA)不一样——浏览器加载一个 HTML 文件之后,所有的页面切换都在前端完成,服务器只负责提供 JSON 数据。

这就带来一个问题:URL 怎么变?

用户期望的行为是——点击导航、刷新页面、前进后退都能正常工作。这意味着 React 必须"接管"浏览器的 URL,在不刷新页面的前提下改变地址栏的内容。

React Router 就是做这件事的。它的核心思想很简单:

把 URL 当成一个状态,当它变化时,渲染对应的组件。


React Router v6 快速上手

安装与基础配置

npm install react-router-dom
// main.jsx
import { BrowserRouter } from 'react-router-dom';
import App from './App';

createRoot(document.getElementById('root')).render(
  <BrowserRouter>
    <App />
  </BrowserRouter>
);
// App.jsx
import { Routes, Route } from 'react-router-dom';

function App() {
  return (
    <Routes>
      <Route path="/" element={<Home />} />
      <Route path="/about" element={<About />} />
      <Route path="/blog" element={<Blog />} />
      <Route path="*" element={<NotFound />} />
    </Routes>
  );
}

Link 和 NavLink

import { Link, NavLink } from 'react-router-dom';

function Navbar() {
  return (
    <nav>
      {/* 基础链接 */}
      <Link to="/">首页</Link>

      {/* NavLink 会自动给当前页面高亮 */}
      <NavLink
        to="/blog"
        className={({ isActive }) => isActive ? 'active' : ''}
      >
        博客
      </NavLink>
    </nav>
  );
}

NavLink 是 Link 的增强版——它知道自己是不是当前页,可以自动应用激活样式。

编程式导航

有时候需要在代码里控制跳转(比如表单提交成功后跳转到新页面):

import { useNavigate } from 'react-router-dom';

function LoginForm() {
  const navigate = useNavigate();

  async function handleSubmit(e) {
    e.preventDefault();
    const result = await login(username, password);
    if (result.success) {
      navigate('/dashboard');  // 成功后跳转
    }
  }
}

路由嵌套与 Outlet

一个常见的布局模式:顶部导航栏、侧边栏是固定的,中间的内容区域跟随路由变化。

┌─────────────────────────────┐
│      Navbar (固定)           │
├────────┬────────────────────┤
│Sidebar │  内容区域 (变化)     │
│ (固定) │                    │
│        │                    │
└────────┴────────────────────┘
function App() {
  return (
    <Routes>
      <Route path="/" element={<Layout />}>
        {/* 这些路由的内容会渲染到 Layout 的 Outlet 位置 */}
        <Route index element={<Home />} />
        <Route path="dashboard" element={<Dashboard />} />
        <Route path="settings" element={<Settings />} />
      </Route>
    </Routes>
  );
}

function Layout() {
  return (
    <div>
      <Navbar />
      <div className="main">
        <Sidebar />
        <div className="content">
          <Outlet />  {/* 子路由的内容渲染在这里 */}
        </div>
      </div>
    </div>
  );
}

<Outlet /> 就是路由的「插槽」——子路由匹配到哪个组件,它就渲染哪个组件。而 Layout 组件本身保持不变(导航栏、侧边栏不用重新渲染)。这个特性在搭建复杂布局时非常关键。


动态路由与 URL 参数

博客文章页面,每篇文章有一个唯一 ID。URL 大概是 /blog/123,其中 123 是动态的。

<Route path="/blog/:id" element={<BlogPost />} />
import { useParams } from 'react-router-dom';

function BlogPost() {
  const { id } = useParams();  // id = "123"

  const [post, setPost] = useState(null);

  useEffect(() => {
    fetch(`/api/posts/${id}`)
      .then(res => res.json())
      .then(setPost);
  }, [id]);

  if (!post) return <Loading />;
  return <PostDetail post={post} />;
}

导航守卫与重定向

保护需要登录的页面

function ProtectedRoute({ children }) {
  const isLoggedIn = useAuthStore(s => s.isLoggedIn);

  if (!isLoggedIn) {
    // 未登录 → 跳到登录页,并记住想去的页面
    return <Navigate to="/login" replace />;
  }

  return children;
}

// 使用
<Route path="/dashboard" element={
  <ProtectedRoute>
    <Dashboard />
  </ProtectedRoute>
} />

旧路径重定向到新路径

// 旧版路径自动跳转
<Route path="/old-about" element={<Navigate to="/about" replace />} />

查询参数与 useSearchParams

博客列表页的翻页和筛选一般用查询参数实现:/blog?page=2&tag=react

import { useSearchParams } from 'react-router-dom';

function BlogList() {
  const [searchParams, setSearchParams] = useSearchParams();

  const page = Number(searchParams.get('page')) || 1;
  const tag = searchParams.get('tag') || '';

  function goToPage(n) {
    setSearchParams({ page: n, tag });  // 保留其他参数
  }

  return (
    <div>
      {/* 翻页按钮 */}
      <button onClick={() => goToPage(page - 1)} disabled={page === 1}>上一页</button>
      <span>第 {page} 页</span>
      <button onClick={() => goToPage(page + 1)}>下一页</button>
    </div>
  );
}

懒加载与代码分割

当应用变大后,所有页面打包进一个 JS 文件会导致首屏加载很慢。React Router 配合 lazy 实现按需加载:

import { lazy, Suspense } from 'react';

// 每个页面单独打包,访问时才加载
const Home = lazy(() => import('./pages/Home'));
const Dashboard = lazy(() => import('./pages/Dashboard'));
const Settings = lazy(() => import('./pages/Settings'));

function App() {
  return (
    <Suspense fallback={<LoadingSpinner />}>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/dashboard" element={<Dashboard />} />
        <Route path="/settings" element={<Settings />} />
      </Routes>
    </Suspense>
  );
}

Suspense 在组件加载过程中显示一个 fallback(加载动画),让用户知道"页面正在加载",而不是看一片空白。


本章小结

概念一句话总结
BrowserRouter包装整个应用,启用前端路由
Routes/Route声明式定义 URL 到组件的映射
Link/NavLink无刷新的页面跳转,NavLink 自带激活判断
Outlet嵌套路由的插槽,布局组件渲染子路由内容
useParams读取动态路由参数 /blog/:id
Navigate声明式重定向
useSearchParams读写查询参数 /blog?page=2
lazy + Suspense按需加载页面,减小首屏包体积

路由是现代前端框架的基石。掌握这些概念后,你就拥有了搭建完整多页 SPA 的能力。下一章,我们聚焦 性能优化——如何让 React 应用更快、更流畅。


📌 创作者: Yardon  |  🏠 个人网站: GlimmerAI.top

📖 本章是「React 从入门到生产」系列的第 6 章。上一章:状态管理选型 | 下一章:性能优化

🌟 如果你觉得有帮助,欢迎访问 GlimmerAI.top 查看我的更多作品。欢迎大家来观看!

React实战 ---- 路由配置及多级导航切换路由 在管理系统这类项目中,比较常见的设计还是这样的。 404页面,宣传主页,登录页面,注册页面,找回密码页面单独处理。 而系统内部就需要统一管理了,不仅仅要管理用户信息 token的有效性,为了良好的用户体验,我们还有需要使用二级路由。 老规矩,先上源码Liz606/webpack-es6-react 讲解在这里:手把手带你搭建与配置Webpack + ES6 + React开发环境 这时我们就需要... 阅读详情

相关推荐

React+Router多级导航切换路由

背景 我们需要开发一个管理平台,登陆、注册及网站首页等不需要加载用户信息的页面放置在系统外部,系统内部则是需要验证用户身份及其角色的页面。 文件结构 注:输出文件树及文件 tree ./src /F │ index.html 页面文件入口 │ index.js js文件入口 │ style.scss ├─actions │ api.js │ base.js ├─conta...

WRian_Ban的小晴天 1462

React 路由导航与传参详解

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

2301_80052985的博客 2782

Oracle EBS MRP 模块测试记录

MRP 模块测试记录        构思:创建Shirt成品物料,它由Cloth和Button组成。1*Shirt=1*Cloth+8*Button。        首先创建这三个物料(复制模板创建),并分配给T02。        创建BOM,将这三个物料关联起来。        分别创建资源(人工和设备)制造Cloth和Button。        分别创建两个部门(HumanDep和Mach

NetSuite 张老师 8165

【React路由】编程式路由导航和withRouter的使用——push / replace

借助this.props.history对象上的API对操作路由跳转、前进、后退。

xuxuii的博客 4439

FreeModbus源码详解

本篇按照FreeModbus协议栈的工作流程,对源代码进行总结解析;FreeModbus协议栈作为从机,等待主机传送的数据,当从机接收到一帧完整的报文后,对报文进行解析,然后响应主机,发送报文给主机,实现主机和从机之间的通信; 1:demo.c中三个函数,完成协议栈的准备工作; eMBInit()函数:(mb.c) /*函数功能: *1:实现RTU模式和ASCALL模式的协议栈初始化; *2

2万+

微信小游戏审核避坑指南:如何一次性通过微信审核(附最新审核要求)

本文详细解析微信小游戏审核全流程,提供从开发到上线的关键策略,帮助开发者一次性通过审核。涵盖合规性自查、材料优化、开发环境配置、版本管理、审核材料填写技巧等核心内容,并附最新审核要求和常见驳回问题解决方案,显著提升审核通过率。

weixin_28454475的博客 1411

react之路由导航

React-routerReact-router前言介绍安装常用组件路由类型1、BrowserRouter2、HashRouter路由渲染方式RouteRedirectSwitch导航声明式导航LinkNavLink编程式导航获取history对象路由的Enter与Leave动态路由嵌套路由补充:声明式导航利用组件(Link或NavLink)属性实现路由跳转编程式导航利用路由提供的history对象实现路由跳转1、利用 < Route/> 渲染的组件 ,获取history对象2、利用 withR

牛先森家的博客 2022

别再手动对照了!用Python+ArcGIS Pro一键搞定三调数据转土地三大类

本文介绍如何利用Python和ArcGIS Pro实现三调数据向土地三大类的自动化转换,大幅提升国土空间规划和土地变更调查的工作效率。通过封装分类规则为Python函数并集成到ArcGIS Pro脚本工具中,解决了传统手动操作耗时且易错的问题,适用于大规模数据处理场景。

weixin_29081101的博客 304

react中的路由导航

路由导航(Route Navigation)是指在Web应用程序中,由用户操作或程序自动触发,切换和加载不同的路由(Route)或页面(Page)的过程。在单页应用(Single-Page Application, SPA)中,路由导航通常是通过浏览器的URL地址实现的。通过在URL中指定不同的路径和参数,可以导航到不同的路由或页面,以提供个性化和动态化的用户体验。在前端框架中,常见的路由导航实现包括:1. 静态路由导航:直接通过路由的链接或点击事件进行导航。

Zy000428的博客 2151

Yolov8-pose关键点检测:loss优化 | LRM loss困难样本挖掘,提升难样本、遮挡物等检测精度

LRM loss应用到能够大幅提升pose遮挡物性能

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1715

使用MATLAB求解二维顶盖驱动流问题的详细代码和说明

本文介绍了使用MATLAB求解二维顶盖驱动流问题的涡量-流函数方法。代码采用129×129网格,雷诺数Re=1000,通过迭代求解Navier-Stokes方程,包含流函数方程和涡量输运方程的离散求解。程序实现了边界条件处理、收敛性检查,并提供丰富后处理功能:流线图、涡量分布图、中心线速度曲线、矢量图和三维涡量可视化。计算结果可与Ghia等(1982)的经典数据进行验证。该代码完整展示了CFD问题的数值求解流程,包括参数设置、主循环计算和多种结果呈现方式,适用于流体力学教学和科研验证。

AI的内部世界的博客 225

React Native导航与路由:Navigator与路由系统深度解析

React Native作为一款流行的跨平台移动应用开发框架,其导航与路由系统是构建复杂应用的核心组件。本文将带你全面了解React Native中的导航与路由机制,从基础概念到实际应用,助你轻松掌握页面跳转与管理的精髓。 ## 一、React Native导航系统核心概念 导航系统是React Native应用的骨架,它负责管理不同页面之间的跳转、数据传递和状态维护。在React Nativ

gitblog_01053的博客 1022

鸿蒙系统开发工程师:核心技术解析与深度面试指南

摘要: 鸿蒙系统开发工程师需具备底层驱动开发、系统移植优化及分布式架构能力。核心职责包括硬件适配(Bootloader、内核移植、HDF驱动开发)、性能调优(启动加速、功耗管理)及稳定性保障。技术要求涵盖C/C++编程、Linux内核机制、鸿蒙架构(HDF、分布式服务)及ArkTS/ArkUI基础。面试重点考察系统移植流程(如ARM板适配)、驱动开发(I2C/Display)、性能优化手段及内存/同步机制的应用。

郑伟强dev的专栏 430

React Native 路由与导航

简介 在 React 中实现路由,有两种方案,分别对应两个不同的场景 React-Router React-Router 适用于 Web 项目。 React-Navigation React Native 没有像浏览器那样的内置导航 API (location对象,history对象)。React Native 中的导航是通过React-Navigation来完成的。React Native 把导航和路由都集中到了 React-Navigation 中。 RN 0.44 之前,React-Navi

weixin_50983325的博客 1308

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

ReactJS 101路由实战:如何使用React Router构建单页应用的7个技巧

在当今前端开发领域,**React Router**已成为构建现代化**单页应用**(SPA)的黄金标准。作为React生态系中最重要的路由管理库,它让开发者能够轻松创建无缝的用户体验,实现页面间的平滑切换而无需重新加载。本文将分享7个实用技巧,帮助初学者快速掌握React Router的核心概念,构建高效的单页应用。 React Router架构图 ## 📋 技巧一:理解React Rou

gitblog_00208的博客 424

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

React路由

用于获取 URL 路径中的参数。返回一个对象,其中包含当前路由路径中定义的动态参数。特点声明式导航编程式导航实现方式使用或组件使用或history灵活性相对固定,更加直观高度灵活,支持条件导航适用场景静态链接动态路由逻辑和条件导航状态管理自动处理活动状态需手动管理状态HashRouter:适合简单应用,易于配置,但在 SEO 和 URL 美观性方面存在限制。:适合复杂应用,支持现代特性,但需要额外的服务器配置以避免 404 错误。特点HashRouter。

2301_76662406的博客 3870

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【React Router】基于 react-router-dom 的路由配置与导航详解

在传统的多页面应用(MPA)中,每次点击链接都会刷新整个页面。而在现代的单页面应用(SPA)中,页面的切换通常是在客户端完成的,不会进行页面刷新。React Router 便是实现 SPA 路由管理的工具,它通过维护一个路由状态,根据 URL 的变化渲染不同的组件,从而实现无刷新的页面跳转。是 React Router 专为浏览器环境(如 Chrome、Firefox 等)设计的版本,提供了不同的 API 来帮助开发者进行路由配置和管理。:该组件是路由管理的核心组件,它通过history。

lph159的博客 3812

如何使用React路由实现页面导航?

React Router是一个用于React应用程序的标准路由库,它允许你在单页面应用程序(SPA)中快速、简单地实现路由功能。通过React Router,您可以在不重新加载整个页面的情况下,轻松地在组件之间进行导航。通过这篇博客,我们学习了如何在React中使用React Router来实现页面导航。我们从基础的路由设置开始,逐步深入到嵌套路由和动态路由参数的使用。无论你的应用有多复杂,React Router都将为你提供灵活且强大的路由解决方案,帮助你构建出更为友好的用户体验。

有我更精彩的博客 1113

React 入门第四天:理解React中的路由与导航

React Router是一个用于在React应用中实现路由功能的库。它允许你根据URL的不同路径渲染不同的组件,从而创建多页面的效果。React Router的核心思想是通过声明式的方式定义路由,让你能够轻松地管理应用的导航。

Caleb的博客 585

React路由与导航

React路由是一种管理应用程序URL和视图之间映射关系的机制。它允许我们根据URL的变化来渲染不同的组件,并保持应用程序的状态。React路由器库通常被用于实现这个功能,其中最受欢迎的是React Router。React Router提供了一系列的组件,比如RouterRouteSwitch和Link等,用于定义路由规则、匹配URL和渲染对应的组件。通过将这些组件嵌套在应用程序中,我们可以创建复杂的路由配置,并实现多级嵌套的视图。

精通前端技术,了解后端接口 502

0605路由导航-react路由-react

0605路由导航-react路由-react

gaogzhen的博客 854

终极指南:如何使用history库实现React路由拦截与导航控制

在现代前端开发中,history库是管理浏览器会话历史的核心工具,它提供了强大的路由导航控制和拦截能力。作为React生态系统的基石,history库让开发者能够轻松处理单页应用的页面跳转、历史记录管理和用户交互保护。本文将带您深入理解history库与React的完美集成,从基础应用到高级拦截模式。 ## 🔍 什么是history库? **history库**是一个轻量级的JavaScri

gitblog_00742的博客 764

React/Vue 实现路由鉴权、导航守卫和路由拦截的优化建议

本文介绍了在 React 和 Vue 中如何实现路由鉴权、导航守卫和路由拦截的方法。路由鉴权是指根据用户权限验证用户是否有权限访问特定的路由页面。导航守卫是在路由切换之前执行的钩子函数,用于控制路由的跳转。路由拦截是在路由处理过程中拦截某些特定路由的行为。本文将介绍 React 和 Vue 中的相关概念和实现方式,并通过示例代码展示如何应用这些概念来实现路由鉴权、导航守卫和路由拦截。

chen520的博客 4018

前端路由暗战:React与Vue的导航哲学对决

这个看似简单的问题,让我重新审视了两个框架路由系统的本质差异。今天,就带大家看看路由背后的"魔法"是如何实现的。

欢迎来到我的前端博客!这里汇集了关于前端开发的最新技术、实用工具和经验分享。我将为你提供详细的教程、代码示例和实战案例,帮助你掌握Web开发的核心概念和技能。不论你是初学者还是有经验的开发者,这个博客都适合你。 1010

React 性能:memo / useMemo / useCallback

讲清 memo/useMemo/useCallback 的配合与边界,先测量再优化,避开常见过早优化。

JudithHuang的博客 327
上一篇: React 从入门到生产(五):状态管理选型
下一篇: React 从入门到生产(七):性能优化实战
Yardon_Official
博客等级 码龄5年 800粉丝 207原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yardon_Official

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值