深入理解 Next.js 的路由机制

作者:码力无边


在上一篇文章中,我们成功创建并运行了第一个 Next.js 应用。当你打开项目文件夹时,你可能会注意到一个名为 pages 的目录。这个目录看似普通,但它却是 Next.js 路由系统的核心。今天,我们将深入探索这个“约定优于配置”的强大机制。

如果你有使用过其他前端框架(如 react-router-dom)的经验,你可能习惯于在一个集中的地方手动编写路由配置。你需要将 URL 路径映射到相应的组件上。

// react-router-dom 的传统方式
<Routes><Route path="/" element={<Home />} /><Route path="about" element={<About />} />
</Routes>

Next.js 则采取了一种截然不同的、更直观的方式:你的文件系统就是你的路由

核心理念:pages 目录即路由

在 Next.js 中,pages 目录下的每个 React 组件文件都会自动成为应用程序中的一个页面(路由)。文件路径直接映射到 URL 路径。

这种方法有几个显而易见的好处:

  • 直观:项目结构清晰地反映了网站的 URL 结构。
  • 零配置:你不需要编写任何路由配置文件,只需创建文件即可。
  • 易于维护:添加、删除或重命名页面就像操作文件一样简单。

现在,让我们通过几个实例来具体了解它是如何工作的。

1. 创建基础页面(静态路由)

这是最简单的情况。你只需在 pages 目录下创建一个 .js, .jsx, .ts, 或 .tsx 文件。

假设我们想创建一个“关于我们”的页面,其 URL 应该是 /about。我们只需要在 pages 目录下创建一个名为 about.tsx 的文件:

文件路径: pages/about.tsx

// pages/about.tsxfunction AboutPage() {return (<div><h1>关于我们</h1><p>这是一个使用 Next.js 构建的博客专栏。</p></div>);
}export default AboutPage;

就这样!现在启动你的开发服务器 (npm run dev),然后访问 http://localhost:3000/about,你就能看到这个页面了。

特殊文件pages/index.tsx 是一个特殊的文件,它对应的是网站的根路径 /

2. 构建嵌套路由

如果你的网站结构更复杂,需要像 /dashboard/settings 这样的嵌套 URL 呢?同样简单,只需在 pages 目录下创建相应的文件夹结构即可。

让我们来创建一个用户仪表盘的路由结构:

  1. pages 目录下创建一个名为 dashboard 的文件夹。
  2. dashboard 文件夹内创建 index.tsxsettings.tsx

文件结构:

pages/
├── dashboard/
│   ├── index.tsx
│   └── settings.tsx
└── ...

对应的路由:

  • pages/dashboard/index.tsx -> /dashboard
  • pages/dashboard/settings.tsx -> /dashboard/settings

这种方式让你的项目结构与 URL 保持高度一致,一目了然。

3. 探索动态路由

这是 Next.js 路由最强大的功能之一。很多时候,我们需要的页面路径不是固定的,而是包含动态参数的。例如,博客文章的 URL (/posts/my-first-post),商品详情页的 URL (/products/123)。

为了实现这一点,Next.js 引入了方括号 [] 语法

假设我们要为博客文章创建动态路由。我们可以在 pages 目录下创建一个这样的文件:

文件路径: pages/posts/[slug].tsx

这里的 [slug] 就是一个动态段(dynamic segment)。slug 是一个占位符,它可以匹配 /posts/ 之后的任何字符串,比如 /posts/hello-world/posts/getting-started

那么,我们如何在页面组件中获取到这个动态的 slug 值呢?这就需要用到 Next.js 提供的 useRouter 钩子(Hook)。

// pages/posts/[slug].tsximport { useRouter } from 'next/router';function PostPage() {const router = useRouter();const { slug } = router.query; // 从 router.query 中解构出 slug// 在页面首次加载时,router.query 可能为空,需要处理这种情况if (!router.isReady) {return <div>加载中...</div>;}return (<div><h1>文章标题:{slug}</h1><p>这里是文章的具体内容...</p></div>);
}export default PostPage;

现在,当你访问 http://localhost:3000/posts/my-first-article 时,页面上就会显示 “文章标题:my-first-article”。

提示:你也可以创建更复杂的动态路由,比如 pages/shop/[category]/[id].tsx,它会匹配像 /shop/electronics/123 这样的 URL。

总结

今天,我们学习了 Next.js 路由系统的三大核心用法:

路由类型文件结构示例对应的 URL
静态路由pages/contact.tsx/contact
嵌套路由pages/profile/index.tsx/profile
动态路由pages/blog/[slug].tsx/blog/any-post-name

通过将路由定义与文件系统绑定,Next.js 极大地简化了路由管理,降低了开发者的心智负担。你不再需要维护一个复杂的路由配置文件,只需要关注于你的页面组件和项目的文件结构。

我们已经知道如何创建页面了,但一个完整的网站还需要在这些页面之间进行导航。在下一篇文章中,我们将学习如何使用 Next.js 的 <Link> 组件和 useRouter 钩子来实现流畅的客户端导航。敬请期待!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95617.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95617.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/95617.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

modbus_tcp和modbus_rtu对比移植AT-socket,modbus_tcp杂记

modbus_rtu通信时没有连接过程&#xff0c;主机和从机各自初始化自身串口就行了&#xff0c;而rtu需要确定从机ID。注:在TCP连接中&#xff0c;不同的网卡有不同的IP&#xff0c;port对应具体的程序。/* 先读取数据 */for (i 0; i < len; i){if (pdPASS ! xQueueReceive(re…

Docker Compose 详解:从安装到使用的完整指南

在现代容器化应用开发中&#xff0c;Docker Compose 是一个不可或缺的工具&#xff0c;它能够帮助我们轻松定义和运行多容器的 Docker 应用程序。 一、什么是 Docker Compose&#xff1f; Docker Compose 是 Docker 官方提供的一个工具&#xff0c;用于定义和运行多容器 Dock…

springboot配置多数据源(mysql、hive)

MyBatis-Plus 不能也不建议同时去“控制” Hive。它从设计到实现都假定底层是 支持事务、支持标准 SQL 方言 的 关系型数据库&#xff08;MySQL、PostgreSQL、Oracle、SQL Server 等&#xff09;&#xff0c;而 Hive 两者都不完全符合。如果操作两个数据源都是mysql或者和关系数…

2025年上海市星光计划第十一届职业院校技能大赛高职组“信息安全管理与评估”赛项交换部分前6题详解(仅供参考)

1.北京总公司和南京分公司有两条裸纤采用了骨干链路配置,做必要的配置,只允许必要的Vlan 通过,不允许其他 Vlan 信息通过包含 Vlan1,禁止使用 trunk链路。 骨干链路位置​​:总公司 SW 与分公司 AC 之间的两条物理链路(Ethernet 1/0/5-6 必要 VLAN​​: •总公司:Vlan…

学习nginx location ~ .*.(js|css)?$语法规则

引言 nginx作为一款高性能的Web服务和反向代理服务&#xff0c;在网站性能优化中扮演着重要的角色。其中&#xff0c;location指令的正确配置是优化工作的关键之一。 这篇记录主要解析location ~ .*\.(js|css)?$这一特定的语法规则&#xff0c;帮助大家理解其在nginx配置中的…

Nmap网络扫描工具详细使用教程

目录 Nmap 主要功能 网络存活主机发现 (ARP Ping Scan) 综合信息收集扫描 (Stealth SYN Service OS) 全端口扫描 (Full Port Scan) NSE 漏洞脚本扫描 SMB 信息枚举 HTTP 服务深度枚举 SSH 安全审计 隐蔽扫描与防火墙规避 Nmap 主要功能 Nmap 主要有以下几个核心功能…

Spring Boot 3.x 的 @EnableAsync应用实例

语法结构使用 EnableAsync 其实就像为你的应用穿上一件时尚的外套&#xff0c;简单又高效&#xff01;只需在你的配置类上添加这个注解&#xff0c;轻松开启异步之旅。代码如下&#xff1a;想象一下&#xff0c;你的应用一瞬间变得灵活无比&#xff0c;像一个跳舞的机器人&…

Nginx Tomcat Jar包开机启动自动配置

一、Nginx配置1、创建systemd nginx 服务文件vi /usr/lib/systemd/system/nginx.service### 内容[Unit] DescriptionThe nginx HTTP and reverse proxy server Afternetwork.target[Service] Typeforking ExecStartPre/mnt/nginx/sbin/nginx -t ExecStart/mnt/nginx/sbin/nginx…

修订版!Uniapp从Vue3编译到安卓环境踩坑记录

Uniapp从Vue3编译到安卓环境踩坑记录 在使用Uniapp开发Vue3项目并编译到安卓环境时&#xff0c;我遇到了不少问题&#xff0c;现将主要踩坑点及解决方案整理如下&#xff0c;供大家参考。 1. 动态导入与静态导入问题 问题描述&#xff1a; 在Vue3项目中使用的动态导入语法在Uni…

零售消费企业的数字化增长实践,2025新版下载

当下零售消费行业&#xff0c;早不是有货就好卖的时代了。一方面&#xff0c;前两年消费市场的热度催生出大批新品牌入场&#xff0c;供给端瞬间拥挤&#xff1b;另一方面&#xff0c;消费者获取信息越来越容易&#xff0c;新潮流、新观念几天一个变化。企业想稳住增长、必须要…

[网鼎杯 2020 青龙组]AreUSerialz

BUUCTF在线评测BUUCTF 是一个 CTF 竞赛和训练平台&#xff0c;为各位 CTF 选手提供真实赛题在线复现等服务。https://buuoj.cn/challenges#[%E7%BD%91%E9%BC%8E%E6%9D%AF%202020%20%E9%9D%92%E9%BE%99%E7%BB%84]AreUSerialz启动靶机&#xff0c;页面显示php代码 <?phpincl…

贵州移动创维E900V22F-S905L3SB-全分区备份

贵州移动创维E900V22F-S905L3SB-全分区备份刷机教程&#xff1a;请查看压缩包内教程&#xff01;下载地址&#xff1a;链接: https://pan.baidu.com/s/1EyYgLNZlxv-UvHpmTRxA_g?pwd5v8w 提取码: 5v8w链接&#xff1a;https://www.123pan.com/s/Jbe8Vv-dTMN 提取码:0123备用链接…

springboot redis 缓存入门与实战

Spring Boot3 Redis 项目地址https://gitee.com/supervol/loong-springboot-study&#xff08;记得给个start&#xff0c;感谢&#xff09;Redis 介绍Redis 是一款高性能的 内存数据库&#xff08;支持持久化&#xff09;&#xff0c;兼具缓存、NoSQL 存储、分布式锁等核心能力…

Redis缓存三大经典问题:雪崩、穿透、击穿详解

在高并发系统中&#xff0c;Redis作为高性能的内存缓存数据库&#xff0c;缓存可能会引发一系列严重问题——缓存雪崩、缓存穿透、缓存击穿。一、缓存雪崩&#xff08;Cache Avalanche&#xff09;1. 什么是缓存雪崩&#xff1f;缓存雪崩是指大量缓存数据在同一时间集中失效&am…

后端Web实战-删除修改

目录 1.删除员工 1.1.1 需求 1.1.2 接口文档 1.1.3 思路分析 1.1.4 功能开发 1.1.4.1 Controller接收参数 1.1.4.2 Service 1.1.4.3 Mapper 1.1.5 功能测试 1.1.6 前后端联调 2.修改员工 2.1 查询回显 2.1.1 接口文档 2.1.2 实现思路 2.1.3 代码实现 2.1.4 方式…

VNC连接服务器实现远程桌面-针对官方给的链接已经失效问题

按照官方给的链接在安装包的时候找不到链接&#xff0c;原链接可能已经失效新链接# 下载 libjpeg-turbo 官方 debwget --no-proxy "https://sourceforge.net/projects/libjpeg-turbo/files/2.0.90%20(2.1%20beta1)/libjpeg-turbo-official_2.0.90_amd64.deb/download"…

Docker在Windows与Linux系统安装的一体化教学设计

Docker跨平台安装实训课程设计 一、课程定位 本实训课程面向计算机应用技术、云计算技术与应用等专业学生&#xff0c;通过对比学习Docker在Windows和Linux两大主流操作系统上的安装与配置方法&#xff0c;帮助学生掌握容器化技术的基础环境搭建能力&#xff0c;为后续的容器管…

c++多线程(1)------创建和管理线程td::thread

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 std::thread 是 C11 标准库中用于创建和管理线程的核心类&#xff0c;定义在 头文件中。它使得多线程编程变得简单、类型安全且跨平台。 一、std::thread 简介 std::thread 是一个类…

Flutter环境搭建全攻略之-windows环境搭建

一&#xff0c;Flutter 官网&#xff1a;https://flutter.dev Flutter Packages官网&#xff1a;https://pub.dev 二&#xff0c;Windows 上面搭建Flutter Android运行环境 对应软件可以联系客服&#xff0c;或者网盘里面下载 1&#xff0c;Flutter Android环境搭建&#xff1a…

《Docker 零基础入门到实战:容器化部署如此简单,运维效率直接拉满》

相信你对封面图上的「Docker 鲸鱼」图标并不陌生 —— 它正是解决「开发环境能跑&#xff0c;生产环境崩了」的容器化神器&#xff01;Docker 通过打包应用与依赖到轻量容器&#xff0c;实现了「一次构建&#xff0c;到处运行」&#xff0c;彻底消除环境不一致的痛点。本文从 D…