Next.js 路由使用完整指南

Next.js 路由使用指南

目录

  1. 基础路由
    • index 路由
    • 页面路由
    • 布局路由
  2. 嵌套路由
    • 文件夹嵌套
    • 共享布局
  3. 动态路由
    • 单参数路由
    • 多参数路由
    • 可选参数
  4. 路由组
    • 组织结构
    • 共享布局
  5. 平行路由
    • 同时渲染
    • 条件渲染
  6. 拦截路由
    • 模态框
    • 照片预览
  7. 最佳实践
    • 路由组织
    • 性能优化
    • 类型安全

1. 基础路由

Next.js 13+ 使用基于文件系统的路由方式,在 app 目录下创建的文件夹会自动映射为路由路径。

1.1 index 路由

typescript
// app/page.tsx - 首页路由 "/"
export default function Home() {return (<main><h1>欢迎来到首页</h1><p>这是网站的主页内容</p></main>);
}
// app/about/page.tsx - 关于页面路由 "/about"
export default function About() {return (<div><h1>关于我们</h1><p>这是关于页面的内容</p></div>);
}

1.2 布局路由

/ app/layout.tsx - 根布局
export default function RootLayout({children,}: {children: React.ReactNode;}) {return (<html lang="zh"><body><header><nav><a href="/">首页</a><a href="/about">关于</a><a href="/blog">博客</a></nav></header><main>{children}</main><footer><p>© 2024 我的网站</p></footer></body></html>);
}

2. 嵌套路由

2.1 基本嵌套


typescript
// app/blog/layout.tsx - 博客布局
export default function BlogLayout({children,}: {children: React.ReactNode;
}) {return (<div className="blog-container"><aside><h3>博客分类</h3><nav><a href="/blog/tech">技术</a><a href="/blog/life">生活</a></nav></aside><section>{children}</section></div>);
}
// app/blog/page.tsx - 博客首页
export default function BlogIndex() {return <h1>博客文章列表</h1>;
}
// app/blog/tech/page.tsx - 技术博客
export default function TechBlog() {return <h1>技术文章</h1>;
}

2.2 共享布局

typescript
// app/(marketing)/layout.tsx - 营销页面共享布局
export default function MarketingLayout({children,}: {children: React.ReactNode;}) {return (<div className="marketing-layout"><nav className="marketing-nav"><a href="/products">产品</a><a href="/pricing">价格</a><a href="/contact">联系我们</a></nav>{children}</div>);
}

3. 动态路由

3.1 单参数动态路由


typescript
// app/posts/[id]/page.tsx
interface Props {
params: { id: string }
}
export default function Post({ params }: Props) {return (<article><h1>文章 {params.id}</h1></article>);
}
// 生成静态路由参数
export async function generateStaticParams() {const posts = await fetch('https://api.example.com/posts').then(res => res.json());return posts.map((post) => ({id: post.id.toString(),}));
}

3.2 多参数动态路由

typescript
// app/shop/[category]/[product]/page.tsx
interface Props {params: {category: string;product: string;}
}
export default function Product({ params }: Props) {return (<div><h1>{params.product}</h1><p>分类: {params.category}</p></div>);
}

3.3 可选参数路由

typescript
// app/blog/[[...slug]]/page.tsx
interface Props {params: { slug: string[] | undefined }
}
export default function BlogPost({ params }: Props) {if (!params.slug) {return <h1>博客首页</h1>;}return (<article><h1>博客路径: {params.slug.join('/')}</h1></article>);
}

4. 路由组

4.1 基本路由组


typescript
// app/(shop)/layout.tsx
export default function ShopLayout({children,}: {
children: React.ReactNode;}) {return (<div className="shop-container"><nav className="shop-nav"><a href="/products">所有产品</a><a href="/cart">购物车</a></nav>{children}</div>);
}
// app/(shop)/products/page.tsx
export default function Products() {return <h1>产品列表</h1>;
}
// app/(shop)/cart/page.tsx
export default function Cart() {return <h1>购物车</h1>;
}

5. 平行路由

5.1 基本平行路由


typescript
// app/layout.tsx
export default function Layout(props: {
children: React.ReactNode;
modal: React.ReactNode;
sidebar: React.ReactNode;
}) {return (<html><body>{props.sidebar}{props.children}{props.modal}</body></html>);
}
// app/@modal/login/page.tsx
export default function LoginModal() {return (<div className="modal"><h2>登录</h2>{/ 登录表单 /}</div>);
}

6. 拦截路由

6.1 照片预览示例


typescript
// app/photos/[id]/page.tsx
export default function PhotoPage({ params }: { params: { id: string } }) {return <h1>照片页面 {params.id}</h1>;
}
// app/photos/(.)[id]/page.tsx
export default function PhotoModal({ params }: { params: { id: string } }) {return (<div className="modal"><img src={/photos/${params.id}} alt="照片预览" /></div>);
}

7. 最佳实践

7.1 路由组织


app/
├── (auth)/
│ ├── login/
│ │ └── page.tsx
│ └── register/
│ └── page.tsx
├── (marketing)/
│ ├── about/
│ │ └── page.tsx
│ └── contact/
│ └── page.tsx
├── dashboard/
│ ├── layout.tsx
│ ├── page.tsx
│ └── settings/
│ └── page.tsx
└── page.tsx

7.2 类型安全路由

typescript
// lib/routes.ts
export const routes = {home: '/',auth: {login: '/login',register: '/register',},dashboard: {index: '/dashboard',settings: '/dashboard/settings',},blog: {index: '/blog',post: (id: string) => /blog/${id},},
} as const;
// 使用示例
import { routes } from '@/lib/routes';
import Link from 'next/link';
export function Navigation() {return (<nav><Link href={routes.home}>首页</Link><Link href={routes.auth.login}>登录</Link><Link href={routes.blog.post('123')}>博客文章</Link></nav>);
}

7.3 性能优化

typescript
// app/blog/[id]/page.tsx
import { Suspense } from 'react';
// 加载状态组件
function Loading() {return <div>加载中...</div>;
}
// 文章内容组件
async function BlogContent({ id }: { id: string }) {const post = await fetch(/api/posts/${id}).then(res => res.json());return <article>{post.content}</article>;
}
export default function BlogPost({ params }: { params: { id: string } }) {return (<div><h1>博客文章</h1><Suspense fallback={<Loading />}><BlogContent id={params.id} /></Suspense></div>);
}

7.4 错误处理

typescript
// app/error.tsx
'use client';
export default function Error({error,reset,}: {error: Error;reset: () => void;}) {return (<div className="error-container"><h2>出错了!</h2><p>{error.message}</p><button onClick={reset}>重试</button></div>);
}

8. 注意事项

  1. 页面组件必须是默认导出
  2. 布局组件会被其子路由共享
  3. 动态路由参数在构建时需要通过 generateStaticParams 生成
  4. 路由组不会影响 URL 结构
  5. 平行路由可以实现复杂的页面组合
  6. 使用 loading.tsx 和 error.tsx 提供更好的用户体验
  7. 合理使用路由组织可以提高代码可维护性
  8. 类型安全的路由可以减少运行时错误

9. 进阶技巧

  1. 使用中间件进行路由保护
  2. 实现渐进式路由加载
  3. 优化动态路由的静态生成
  4. 实现自定义 404 页面
  5. 集成认证系统
  6. 实现国际化路由
  7. 优化 SEO 配置
  8. 实现路由过渡动画

10. 总结

1.官网:https://www.nextjs.cn/docs/getting-started
2.
在这里插入图片描述

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

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

相关文章

Vue2-从零搭建一个项目(项目基本结构介绍)

目录 一、脚手架安装 二、项目结构介绍 1、项目结构介绍 2、组件关系与脚手架入口内置关系 &#xff08;1&#xff09;组件关系 &#xff08;2&#xff09;脚手架入口内置关系 一、脚手架安装 在默认安装Node.js的前提下&#xff0c;需要进行两两步操作 直接参照下面的…

Redis 之持久化

目录 介绍 RDB RDB生成方式 自动触发 手动触发 AOF&#xff08;append-only file&#xff09; Redis 4.0 混合持久化 Redis主从工作原理 总结 介绍 Redis提供了两个持久化数据的能力&#xff0c;RDB Snapshot 和 AOF&#xff08;Append Only FIle&#xff09;…

8. Debian系统中显示屏免密码自动登录

本文介绍如何在Debian系统上&#xff0c;启动后&#xff0c;自动免密登录&#xff0c;不卡在登录界面。 1. 修改lightDM配置文件 嵌入式Debian系统采用lightDM显示管理器&#xff0c;所以&#xff0c;一般需要修改它的配置文件/etc/lightdm/lightdm.conf&#xff0c;找到[Seat…

Linux下,用ufw实现端口关闭、流量控制(二)

本文是 网安小白的端口关闭实践 的续篇。 海量报文&#xff0c;一手掌握&#xff0c;你值得拥有&#xff0c;让我们开始吧&#xff5e; ufw 与 iptables的关系 理论介绍&#xff1a; ufw&#xff08;Uncomplicated Firewall&#xff09;是一个基于iptables的前端工具&#xf…

MySQL常见面试题(二)

MySQL 索引 MySQL 索引相关的问题比较多&#xff0c;对于面试和工作都比较重要&#xff0c;于是&#xff0c;我单独抽了一篇文章专门来总结 MySQL 索引相关的知识点和问题&#xff1a;MySQL 索引详解 。 MySQL 查询缓存 MySQL 查询缓存是查询结果缓存。执行查询语句的时候&a…

红日靶场vulnstark 2靶机的测试报告

目录 一、测试环境 1、系统环境 2、注意事项 3、使用工具/软件 二、测试目的 三、操作过程 1、信息搜集 2、Weblogic漏洞利用 3、Getshell 4、CS上线 5、内网信息收集 利用zerologon漏洞攻击域控服务器(获取密码) 6、横向移动 ①使用PsExec上线域控服务器 ②使用…

用于LiDAR测量的1.58um单芯片MOPA(一)

--翻译自M. Faugeron、M. Krakowski1等人2014年的文章 1.简介 如今&#xff0c;人们对高功率半导体器件的兴趣日益浓厚&#xff0c;这些器件主要用于遥测、激光雷达系统或自由空间通信等应用。与固态激光器相比&#xff0c;半导体器件更紧凑且功耗更低&#xff0c;这在低功率供…

MFC工控项目实例三十五读取数据库数据

点击按钮打开文件夹中的数据文件生成曲线 相关代码 void CSEAL_PRESSUREDlg::OnTesReport() {CFileDialog dlgOpen(TRUE/*TRUE打开&#xff0c;FALSE保存*/,0,0,OFN_NOCHANGEDIR|OFN_FILEMUSTEXIST,"All Files(mdb.*)|*.*||",//文件过滤器NULL);CString mdb_1, m…

Harnessing Large Language Models for Training-free Video Anomaly Detection

标题&#xff1a;利用大型语言模型实现无训练的视频异常检测 原文链接&#xff1a;https://openaccess.thecvf.com/content/CVPR2024/papers/Zanella_Harnessing_Large_Language_Models_for_Training-free_Video_Anomaly_Detection_CVPR_2024_paper.pdf 源码链接&#xff1a;ht…

Linux笔试题(自己整理,已做完,选择题)

详细Linux内容查看&#xff1a;day04【入门】Linux系统操作-CSDN博客 1、部分笔试题 本文的笔试题&#xff0c;主要是为了复习学习的day04【入门】Linux系统操作-CSDN博客的相关知识点。后续还会更新一些面试相关的题目。 欢迎一起学习

BA是什么?

1.BA的定义 BA的中文译为“光束法平差”,也有翻译为“束调整”、“捆绑调整”等,是一种用于计算机视觉和机器人领域的优化技术,主要用于精确优化相机参数(包括内参数和外参数)和三维空间中特征点的位置。BA的目标是通过最小化重投影误差来提高三维重建的精度和一致性。重投影误…

Windows系统搭建Docker

Windows系统搭建Docker 一、系统虚拟化1.1启用虚拟化1.2启用Hyper-v并开启虚拟任务 二、安装WSL2.1 检验安装2.2 命令安装WSL&#xff08;与2.3选其一&#xff09;2.3 手动安装WSL&#xff08;与2.2选其一&#xff09;2.4 将 WSL 2 设置为默认版本 三、docker安装 一、系统虚拟…

洛谷二刷P4715 【深基16.例1】淘汰赛(c嘎嘎)

题目链接&#xff1a;P4715 【深基16.例1】淘汰赛 - 洛谷 | 计算机科学教育新生态 题目难度&#xff1a;普及 刷题心得&#xff1a;本题是我二刷&#xff0c;之前第一次刷是在洛谷线性表那个题单&#xff0c;当时印象深刻第 一篇题解是用的树来做&#xff0c;当时我不屑一顾&…

基于Matlab BP神经网络的电力负荷预测模型研究与实现

随着电力系统的复杂性和规模的不断增长&#xff0c;准确的电力负荷预测对于电网的稳定性和运行效率至关重要。传统的负荷预测方法依赖于历史数据和简单的统计模型&#xff0c;但这些方法在处理非线性和动态变化的负荷数据时&#xff0c;表现出较大的局限性。近年来&#xff0c;…

非标自动化行业ERP选型与案例展示!

非标自动化行业&#xff0c;那么使用的就是非标设备&#xff0c;什么是非标设备呢?用一句话来说明就是指设计制造方面没有形成国家标准的设备。 在如今追求高效的社会&#xff0c;各行各业都朝着提高效率精益工艺&#xff0c;缩减流程&#xff0c;调整业务&#xff0c;用各种…

十、软件设计架构-微服务-服务调用Dubbo

文章目录 前言一、Dubbo介绍1. 什么是Dubbo 二、实现1. 提供统一业务api2. 提供服务提供者3. 提供服务消费者 前言 服务调用方案--Dubbo‌ 基于 Java 的高性能 RPC分布式服务框架&#xff0c;致力于提供高性能和透明化的RPC远程服务调用方案&#xff0c;以及SOA服务治理方案。…

【AI系统】CANN 算子类型

CANN 算子类型 算子是编程和数学中的重要概念&#xff0c;它们是用于执行特定操作的符号或函数&#xff0c;以便处理输入值并生成输出值。本文将会介绍 CANN 算子类型及其在 AI 编程和神经网络中的应用&#xff0c;以及华为 CANN 算子在 AI CPU 的详细架构和开发要求。 算子基…

uniapp使用扩展组件uni-data-select出现的问题汇总

前言 不知道大家有没有学习过我的这门课程那&#xff0c;《uniCloud云开发Vue3版本官方推荐用法》&#xff0c;这么课程已经得到了官方推荐&#xff0c;想要快速上手unicloud的小伙伴们&#xff0c;可以学习一下这么课程哦&#xff0c;不要忘了给一键三连呀。 在录制这门课程…

TypeScript和JavaScript区别详解

文章目录 TypeScript和JavaScript区别详解一、引言二、类型系统1、静态类型检查TypeScript 示例JavaScript 示例 2、类型推断TypeScript 示例JavaScript 示例 三、面向对象编程TypeScript 示例JavaScript 示例 四、使用示例1. 环境搭建2. 创建TypeScript项目3. 安装TypeScript插…

前端开发 之 15个页面加载特效上【附完整源码】

文章目录 一&#xff1a;彩球环绕加载特效1.效果展示2.HTML完整代码 二&#xff1a;跷跷板加载特效1.效果展示2.HTML完整代码 三&#xff1a;两个圆形加载特效1.效果展示2.HTML完整代码 四&#xff1a;半环加载特效1.效果展示2.HTML完整代码 五&#xff1a;音乐波动加载特效1.效…