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

Next.js 页面和路由

Next.js 页面与路由学习笔记Next.js 13 的 App Router 基于文件系统路由通过文件夹和文件的命名约定自动生成路由无需手动配置路由表。1. 基本路由规则1.1 核心约定文件作用是否必须page.tsx定义路由的 UI页面内容是没有则该路径不可访问layout.tsx定义路由的布局包裹子页面否根布局必须loading.tsx定义加载状态否error.tsx定义错误边界否not-found.tsx定义 404 页面否template.tsx类似 layout但导航时重新挂载否1.2 文件夹 路由段app/ ├── page.tsx → / ├── about/ │ └── page.tsx → /about ├── blog/ │ └── page.tsx → /blog │ └── [slug]/ │ └── page.tsx → /blog/hello-world ├── dashboard/ │ ├── page.tsx → /dashboard │ └── settings/ │ └── page.tsx → /dashboard/settings关键规则只有存在page.tsx的文件夹才是可访问的路由。文件夹名即为 URL 路径段。page.tsx默认导出的组件就是该路由的页面内容。2. 动态路由2.1 基本动态路由[slug]用方括号包裹的文件夹名表示动态参数。app/ └── blog/ └── [slug]/ └── page.tsx → /blog/任意字符串// app/blog/[slug]/page.tsx export default function BlogPost({ params }: { params: { slug: string } }) { return h1文章: {params.slug}/h1; } // 访问 /blog/hello-world → 显示 文章: hello-world // 访问 /blog/nextjs-13 → 显示 文章: nextjs-132.2 多段动态路由app/ └── shop/ └── [category]/ └── [id]/ └── page.tsx → /shop/shoes/nike-001// app/shop/[category]/[id]/page.tsx export default function Product({ params, }: { params: { category: string; id: string }; }) { return ( div p分类: {params.category}/p p商品: {params.id}/p /div ); }2.3 捕获所有路由[...slug]用[...slug]匹配剩余所有路径段至少匹配一段。app/ └── docs/ └── [...slug]/ └── page.tsxURLparams.slug/docs/getting-started[getting-started]/docs/api/reference[api, reference]/docs/guide/advanced/config[guide, advanced, config]/docs404至少需要一段2.4 可选捕获所有路由[[...slug]]用双括号表示可选0 段或多段都匹配。app/ └── docs/ └── [[...slug]]/ └── page.tsxURLparams.slug/docsundefined或[]/docs/getting-started[getting-started]/docs/api/reference[api, reference]3. 布局系统 (Layout)3.1 根布局 (Root Layout)必须存在定义在app/layout.tsx包含html和body标签。// app/layout.tsx export default function RootLayout({ children, }: { children: React.ReactNode; }) { return ( html langzh body header全局导航栏/header main{children}/main footer全局页脚/footer /body /html ); }3.2 嵌套布局 (Nested Layout)子目录中的layout.tsx会嵌套在父布局内不会替换父布局。app/ ├── layout.tsx ← 根布局全局导航 页脚 ├── page.tsx ← 首页 └── dashboard/ ├── layout.tsx ← 仪表盘布局侧边栏 ├── page.tsx ← /dashboard └── settings/ └── page.tsx ← /dashboard/settings// app/dashboard/layout.tsx export default function DashboardLayout({ children, }: { children: React.ReactNode; }) { return ( div style{{ display: flex }} nav侧边栏概览 | 设置 | 消息/nav section{children}/section /div ); }渲染结果访问/dashboard/settingshtml body header全局导航栏/header ← 根布局 main div styledisplay:flex nav侧边栏/nav ← dashboard 布局 section h1设置页面/h1 ← settings/page.tsx /section /div /main /body /html3.3 layout vs template特性layout.tsxtemplate.tsx实例共享导航时不重新创建独立每次导航重新挂载状态保持保持跨页面共享状态不保持每次重置性能更好不重新挂载稍差适用场景通用布局进入/离开动画、useEffect每次执行4. 特殊文件详解4.1loading.tsx— 加载状态利用 React Suspense在页面数据加载时自动显示。// app/dashboard/loading.tsx export default function Loading() { return ( div classNameflex items-center justify-center h-screen div classNameanimate-spin rounded-full h-12 w-12 border-b-2 border-blue-500 / /div ); }效果访问/dashboard时如果页面组件正在获取数据先显示 loading 动画数据就绪后自动替换为真实内容。4.2error.tsx— 错误边界捕获当前路由段的运行时错误显示友好的错误提示。// app/error.tsx use client; // 必须是客户端组件 export default function Error({ error, reset, }: { error: Error { digest?: string }; reset: () void; }) { return ( div h2出错了/h2 p{error.message}/p button onClick{() reset()}重试/button /div ); }4.3not-found.tsx— 404 页面当调用notFound()函数或路径不存在时显示。// app/not-found.tsx export default function NotFound() { return ( div h1404/h1 p页面不存在/p a href/返回首页/a /div ); } // 在页面中主动触发 import { notFound } from next/navigation; export default async function Post({ params }) { const post await getPost(params.slug); if (!post) { notFound(); // 触发 not-found.tsx } return article{post.title}/article; }4.4route.ts— API 路由处理 HTTP 请求替代传统的 Express 路由。// app/api/users/route.ts import { NextResponse } from next/server; // GET /api/users export async function GET() { const users await db.user.findMany(); return NextResponse.json(users); } // POST /api/users export async function POST(request: Request) { const body await request.json(); const user await db.user.create({ data: body }); return NextResponse.json(user, { status: 201 }); }5. 路由组 (Route Groups)用圆括号(groupName)创建的文件夹不影响 URL仅用于组织代码。5.1 按布局分组app/ ├── (auth)/ │ ├── layout.tsx ← 登录/注册专用布局无导航栏 │ ├── login/ │ │ └── page.tsx → /login │ └── register/ │ └── page.tsx → /register ├── (marketing)/ │ ├── layout.tsx ← 营销页面布局有导航栏 页脚 │ ├── page.tsx → / │ └── about/ │ └── page.tsx → /about/login和/register共享(auth)布局无导航栏。/和/about共享(marketing)布局有导航栏。URL 中不包含(auth)或(marketing)。5.2 按团队/功能分组app/ ├── (admin)/ │ ├── dashboard/ │ │ └── page.tsx → /dashboard │ └── users/ │ └── page.tsx → /users └── (store)/ ├── products/ │ └── page.tsx → /products └── cart/ └── page.tsx → /cart6. 平行路由 (Parallel Routes)用slotName命名的文件夹允许在同一布局中同时渲染多个页面。6.1 结构app/ ├── layout.tsx ← 引用 analytics 和 team ├── analytics/ │ └── page.tsx ← 分析面板 ├── team/ │ └── page.tsx ← 团队面板 └── page.tsx ← 主内容6.2 布局接收 slots// app/layout.tsx export default function Layout({ children, analytics, team, }: { children: React.ReactNode; analytics: React.ReactNode; team: React.ReactNode; }) { return ( div style{{ display: grid, gridTemplateColumns: 1fr 1fr 1fr }} div{analytics}/div div{children}/div div{team}/div /div ); }6.3 典型场景模态框app/ ├── layout.tsx ├── modal/ │ ├── (.)login/ ← 拦截 /login在模态框中显示 │ │ └── page.tsx │ └── default.tsx ← 模态框未激活时显示 null ├── login/ │ └── page.tsx ← 直接访问 /login 的完整页面 └── page.tsx// app/modal/default.tsx export default function Default() { return null; // 模态框未激活时不显示 } // app/layout.tsx export default function Layout({ children, modal }) { return ( {children} {modal} / ); }7. 拦截路由 (Intercepting Routes)在不改变 URL 的情况下用另一个路由的内容渲染当前页面。7.1 命名约定约定含义(.)folder拦截同级的 folder 路由(..)folder拦截上一级的 folder 路由(..)(..)folder拦截上两级的 folder 路由(...)folder拦截根目录的 folder 路由7.2 典型场景照片弹窗app/ ├── layout.tsx ├── modal/ │ └── (.)photo/ │ └── [id]/ │ └── page.tsx ← 弹窗版本从照片列表点击进入 ├── photo/ │ └── [id]/ │ └── page.tsx ← 完整页面版本直接访问 URL └── page.tsx ← 照片列表从列表点击URL 变为/photo/123但显示弹窗拦截路由生效。直接访问/photo/123显示完整页面拦截路由不生效。刷新/photo/123显示完整页面刷新不走客户端导航。8. 页面导航8.1Link组件import Link from next/link; export default function Nav() { return ( nav Link href/首页/Link Link href/about关于/Link Link href/blog/hello-world文章/Link {/* 动态链接 */} Link href{/blog/${post.slug}}{post.title}/Link {/* 激活状态 */} Link href/about scroll{false}关于不滚动到顶部/Link /nav ); }特性视口内的Link自动预取prefetch目标页面。客户端导航不会整页刷新。自动滚动到页面顶部可关闭。8.2 编程式导航use client; import { useRouter } from next/navigation; export default function LoginForm() { const router useRouter(); async function handleSubmit() { const success await login(); if (success) { router.push(/dashboard); // 导航到 /dashboard router.refresh(); // 刷新当前路由重新获取数据 } } return button onClick{handleSubmit}登录/button; }方法作用router.push(href)导航到新页面加入历史记录router.replace(href)替换当前页面不加入历史记录router.back()返回上一页router.refresh()刷新当前路由重新获取服务端数据8.3 导航行为对比行为Linkrouter.pusha标签客户端导航是是否整页刷新预取是否否历史记录加入加入加入适用场景大多数导航表单提交后跳转外部链接9. 路由元数据 (Metadata)9.1 静态元数据// app/about/page.tsx export const metadata { title: 关于我们, description: 这是关于我们的页面, }; export default function AboutPage() { return h1关于我们/h1; }9.2 动态元数据// app/blog/[slug]/page.tsx export async function generateMetadata({ params }) { const post await getPost(params.slug); return { title: post.title, description: post.excerpt, openGraph: { title: post.title, description: post.excerpt, images: [post.coverImage], }, }; }9.3 布局中的元数据继承子页面的title会覆盖父布局的title也可用模板语法// app/layout.tsx export const metadata { title: { default: 我的网站, // 默认标题 template: %s | 我的网站, // 子页面标题模板 }, }; // app/about/page.tsx export const metadata { title: 关于我们, // 最终: 关于我们 | 我的网站 };10. 完整路由速查表文件/文件夹URL说明app/page.tsx/首页app/about/page.tsx/about静态路由app/blog/[slug]/page.tsx/blog/hello动态路由app/shop/[...slug]/page.tsx/shop/a/b/c捕获所有路由app/docs/[[...slug]]/page.tsx/docs或/docs/a/b可选捕获所有路由app/(auth)/login/page.tsx/login路由组不影响 URLapp/modal/(.)photo/[id]/page.tsx/photo/123平行路由 拦截路由app/api/users/route.ts/api/usersAPI 路由总结Next.js 路由系统的核心记忆点文件即路由page.tsx定义可访问路径文件夹名即 URL 段动态参数[slug]单段、[...slug]多段、[[...slug]]可选多段布局嵌套layout.tsx从根到叶逐层嵌套导航时不销毁路由组(group)组织代码不影响 URL平行路由slot同一布局渲染多个独立视图拦截路由(.)在客户端导航时拦截直接访问不拦截特殊文件loading/error/not-found处理非理想状态

相关文章:

Next.js 页面和路由

Next.js 页面与路由学习笔记 Next.js 13 的 App Router 基于文件系统路由,通过文件夹和文件的命名约定自动生成路由,无需手动配置路由表。 1. 基本路由规则 1.1 核心约定 文件作用是否必须page.tsx定义路由的 UI(页面内容)是&a…...

Dify-Flow:构建复杂AI工作流的流程编排引擎设计与实现

1. 项目概述:当Dify遇上Flow,一个面向开发者的AI应用编排新范式如果你最近在折腾AI应用开发,特别是想把大语言模型(LLM)的能力集成到自己的业务流程里,那你大概率听说过Dify。它作为一个开源的LLM应用开发平…...

DecK工具介绍(Declarative Configuration for Kong网关的声明式配置工具,可同步配置,热更新运行中的网关)类似Terraform、导出Kong配置、导出配置

文章目录DecK 完全指南:Kong 网关的声明式配置工具一、什么是 decK?二、为什么需要 decK?三、decK 的核心思想四、decK 的工作原理五、decK 支持管理哪些对象?六、安装 decKLinux/macOSWindows验证安装七、连接 Kong八、导出 Kong…...

手把手教你为STM32的SD卡驱动FatFs:从AU Size到disk_ioctl的完整配置流程

STM32实战:从SD卡协议到FatFs移植的全流程解析 在嵌入式开发中,存储系统设计往往是项目成败的关键一环。当我们需要在STM32平台上实现可靠的文件存储功能时,SD卡配合FatFs文件系统无疑是最经典的组合方案之一。然而,从硬件接口调试…...

ClaudE2E:跨IDE多智能体AI开发框架的设计与实战

1. 项目概述:一个为AI编程IDE设计的端到端多智能体开发框架如果你和我一样,经常在Claude Code、Cursor、Google Antigravity和OpenCode这几个AI驱动的IDE之间切换,肯定会遇到一个头疼的问题:每个工具都有自己的一套配置、规则和智…...

Java版Dify SDK:简化LLM应用开发,提升Java生态集成效率

1. 项目概述:为什么我们需要一个Java版的Dify SDK?如果你正在用Java构建一个需要集成大语言模型能力的应用,比如一个智能客服系统、一个文档分析工具,或者一个创意写作助手,你很可能听说过Dify。Dify作为一个开源的LLM…...

Browserwing:浏览器内自动化脚本平台的设计、实现与应用

1. 项目概述:一个浏览器内的“翅膀”如果你和我一样,经常需要在浏览器里处理一些重复、繁琐的任务,比如批量下载网页上的图片、定时刷新页面抓取数据、或者自动填写表单,那你肯定想过:要是浏览器自己能“飞”起来&…...

2025注安备考资料全套|视频+讲义+前导课,直接拿来就能学

大家好,最近很多备考注册安全工程师的同学都在找系统、完整的备考资料,要么是课程零散不全,要么是讲义和视频不配套,复习起来特别费劲。为了帮大家省去整理资料的时间,我把自己整理的2024-2025注安全套备考资料分享出来…...

Zilliz-Skill:为向量数据库构建可插拔AI技能库的实战指南

1. 项目概述:一个为向量数据库赋能的技能库最近在折腾RAG(检索增强生成)应用,发现向量数据库虽然解决了海量非结构化数据的存储和检索问题,但要让一个应用真正“智能”起来,光有向量搜索是远远不够的。比如…...

代码审查进入“零延迟”时代:如何在CI/CD流水线毫秒级触发语义级风险推演?——2026奇点大会核心议题深度拆解

更多请点击: https://intelliparadigm.com 第一章:AI原生代码审查:2026奇点智能技术大会Code Review新范式 在2026奇点智能技术大会上,AI原生代码审查(AI-Native Code Review)正式取代传统人工规则引擎混合…...

深入了解场效应管(FET)的基本原理与特性分析

场效应管(FET)基础概念场效应管(Field Effect Transistor, FET)是一种通过电场效应控制电流的半导体器件,属于电压控制型器件。其核心特点包括高输入阻抗、低驱动功耗和单极型载流子传导(仅多数载流子参与导…...

【实战】C#集成SM4国密算法:从原理到安全通信应用

1. SM4国密算法基础认知 第一次接触SM4算法时,我被它简洁而强大的设计所吸引。作为我国自主设计的商用分组密码标准,SM4与AES有着相似的定位,但采用了完全不同的技术路线。它的分组长度和密钥长度都是128位,这个设计让我想起平时用…...

仅限首批200家认证机构获取:SITS2026兼容性评估矩阵V1.2(含LLM微调知识注入适配表),错过再等18个月!

更多请点击: https://intelliparadigm.com 第一章:AI研发知识管理:SITS2026专题 在AI研发加速演进的背景下,知识管理正从文档归档转向语义化、可执行、可追溯的智能中枢。SITS2026(Semantic Intelligence for Technic…...

SITS 2026发布12项技术白皮书+7套开源工具链:附CSDN认证工程师亲测部署清单(含GitHub直达链接)

更多请点击: https://intelliparadigm.com 第一章:CSDN主办SITS 2026:2026奇点智能技术大会亮点全解析 SITS 2026(Singularity Intelligence Technology Summit)由CSDN联合中国人工智能学会、中科院自动化所共同主办&…...

【奇点智能大会·治理白皮书首发】:基于27家头部AI企业的服务治理数据,验证出唯一有效的3维可观测性模型(QPS/Token耗时/上下文漂移)

更多请点击: https://intelliparadigm.com 第一章:大模型服务治理:奇点智能大会 在2024年奇点智能大会上,大模型服务治理成为核心议题。随着LLM推理服务规模化部署,如何统一调度、细粒度限流、多租户隔离与可观测性闭…...

奇点大会「隐形议程」住宿推荐:主办方未公布的3家闭门交流友好型酒店(含私密会议室共享权限与静音舱预约入口)

更多请点击: https://intelliparadigm.com 第一章:奇点智能技术大会周边酒店推荐 参会者抵达主办城市后,便捷、稳定且具备基础协作设施的住宿环境至关重要。以下推荐均基于步行至主会场(国家人工智能创新中心)≤15分钟…...

企业/学校如何自建在线“慕课“教学平台?Moodle 开源 LMS 初识与部署全攻略

[ 知识是人生的灯塔,只有不断学习,才能照亮前行的道路 ] 0x00 前言简述 背景说明 出于内部学习平台搭建需要,领导吩咐我去探究部署一些开源学习平台,要求支持Office协同文档、学习课程发布、学习记录反馈和支持 OAuth2 客户端以对…...

MediaCreationTool.bat:5分钟解决Windows安装的所有痛点

MediaCreationTool.bat:5分钟解决Windows安装的所有痛点 【免费下载链接】MediaCreationTool.bat Universal MCT wrapper script for all Windows 10/11 versions from 1507 to 21H2! 项目地址: https://gitcode.com/gh_mirrors/me/MediaCreationTool.bat 还…...

CIPHR技术:硬件IP保护的密码学革新与实践

1. 硬件IP保护的技术挑战与CIPHR的创新价值在全球半导体产业链分工日益精细的今天,设计公司不得不将芯片制造环节外包给第三方代工厂,这种模式虽然降低了成本,却也带来了严重的安全隐患。想象一下,你花费数月精心设计的电路图&…...

无实景不建模 孪生自生成:无改造无感追踪技术路径,重构数字孪生与视频孪生交付逻辑

数字孪生长期深陷建模依赖的行业困局,传统技术路径均以人工建模、激光点云扫描、第三方测绘为前置核心环节,不仅带来高昂的资金投入、漫长的实施周期,更存在模型更新滞后、实景适配性差、运维成本高企等难以破解的行业顽疾。同时,…...

企业级中药实验管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

💡实话实说:C有自己的项目库存,不需要找别人拿货再加价。摘要 随着中医药产业的快速发展,中药实验数据的规模化和复杂化对信息化管理提出了更高要求。传统的中药实验管理多依赖手工记录和纸质档案,存在数据易丢失、查询…...

终极显卡驱动清理指南:如何使用Display Driver Uninstaller彻底解决驱动残留问题

终极显卡驱动清理指南:如何使用Display Driver Uninstaller彻底解决驱动残留问题 【免费下载链接】display-drivers-uninstaller Display Driver Uninstaller (DDU) a driver removal utility / cleaner utility 项目地址: https://gitcode.com/gh_mirrors/di/dis…...

0301国产光刻机突围全景:双工件台+纳米级精密运动控制 1. 双工件台工作逻辑

国产光刻机突围全景:双工件台纳米级精密运动控制 第三卷 双工件台纳米级精密运动控制(A级 中期集中攻坚) 1. 双工件台工作逻辑(喂饭级实操版带量化参数企业单字脱敏) 一、核心定义:先搞懂“双工件台”的本质…...

Starknet智能体经济基础设施:构建自主安全的链上AI代理

1. 项目概述:构建自主、安全的 Starknet 智能体经济基础设施如果你正在探索如何让 AI 智能体(Agent)在区块链上真正“活”起来,而不仅仅是作为一个调用 API 的脚本,那么starknet-agentic这个项目就是你一直在找的答案。…...

【AI技能】跟着费曼学BEV鸟瞰图感知

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 探智求真,学以致用。 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路🥞 文章目录😏1. 概述&#x…...

第十一节:私有知识大脑——为本地 Agent 构建企业级 RAG 检索增强链路

引言 承接上一章我们对 embedding 和向量检索的实战部署,本章将聚焦打造私有知识大脑,通过构建完整的 RAG(Retrieval-Augmented Generation)检索增强链路,极大拓展本地 Agent 在企业场景的应用边界。 核心理论 RAG 是实现大模型实时访问和利用外部知识的关键技术,其数…...

Bleeding Llama漏洞深度剖析:Ollama CVE-2026-7482让30万台AI服务器“内存裸奔“

你以为把大模型部署在本地就高枕无忧了?Cyera研究团队最新披露的"Bleeding Llama"漏洞(CVE-2026-7482)给所有人泼了一盆冷水。这个藏在Ollama量化管道里的堆越界读取缺陷,能让攻击者零认证、零交互,仅用三次…...

基于Godot引擎的模块化RTS游戏框架开发实战指南

1. 项目概述:当开放世界RTS遇上Godot引擎如果你和我一样,是个对即时战略游戏(RTS)有情怀,同时又对Godot引擎的轻量与高效念念不忘的开发者,那么看到“lampe-games/godot-open-rts”这个项目标题时&#xff…...

零知识证明与法律科技融合:构建可验证计算驱动的自动化合约执行系统

1. 项目概述与核心价值最近在开源社区里,一个名为Sheygoodbai/vericlaw的项目引起了我的注意。乍一看这个项目名,可能会觉得有些抽象,但深入探究后,我发现它触及了当前一个非常前沿且充满潜力的交叉领域:如何利用可验证…...

基于Taotoken多模型能力为智能客服场景选型

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 基于Taotoken多模型能力为智能客服场景选型 构建一个高效、经济的智能客服系统,核心挑战之一在于模型选型。不同的模型…...