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

深入理解 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…