Next.js路由导航完全指南
在前端框架(如 React、Vue 等)或移动端开发中,路由系统是实现页面 / 界面导航的核心机制。Next.js 采用 文件系统路由(File System Routing),即根据项目目录结构自动生成路由。
Next.js 目前有两套路由解决方案,Next.js 从 v13.0.0 版本开始引入 App Router,之前的方案称之为“Pages Router”,目前的方案称之为“App Router”,两套路由系统可以相互兼容,Next.js v14+ 默认启用,本文基于 next v15版本说明。
一、关键区别
特性 | Pages Router | App Router |
---|---|---|
目录结构 | 基于 pages/ 目录 | 基于 app/ 目录 |
组件类型 | 仅支持客户端组件 | 支持 Server Components(默认) |
数据获取 | getServerSideProps/getStaticProps | 直接在组件中使用 async/await |
布局方式 | 手动实现 Layout 组件 | 自动支持嵌套布局(layout.js) |
文件类型 | .js/.jsx/.tsx | 新增 .server.jsx/.client.jsx |
二、四种导航方式
Next.js 提供了多种路由导航方式,每种方式都有其特定的使用场景和优势。
1. 组件
是 Next.js 提供的一个内置组件,用于在页面之间进行客户端导航。它扩展了 HTML 的 a 标签,提供了预获取和路由之间的客户端导航功能。这是在 Next.js 中推荐的路由导航方式。基础使用
import Link from 'next/link';export default function Page() {return <Link href="/dashboard">Dashboard</Link>;
}
动态路由
import Link from 'next/link';export default function Page() {const items = [{ id: 1, name: 'Item 1' },{ id: 2, name: 'Item 2' },];return (<ul>{items.map(item => (<li key={item.id}><Link href={`/items/${item.id}`}>{item.name}</Link></li>))}</ul>);
}
获取当前路径名
import { usePathname } from 'next/navigation';export default function Page() {const pathname = usePathname();return <div>Current Path: {pathname}</div>;
}
2. useRouter (客户端组件)
允许你以编程方式改变来自客户端组件的路由,这种方式适用于在事件处理函数或异步操作中进行导航。
'use client';import { useRouter } from 'next/navigation';export default function Page() {const router = useRouter();return (<button type="button" onClick={() => router.push('/dashboard')}>Dashboard</button>);
}
useRouter 的常用方法:
- push:在客户端将新地址添加到浏览器历史栈中。
- replace:在客户端导航时,将现在的访问地址替换成目标地址。
- refresh:刷新当前路由。
- prefetch:预获取提供的路由,加快客户端导航速度。
- back:向后导航到浏览器历史栈中的上一页。
- forward:向前导航到浏览器历史栈中的下一页。
3. redirect 功能(服务端组件)
redirect 函数用于在服务器组件中进行路由跳转。这种方式通常用于在服务器端根据某些条件重定向用户。
import { redirect } from 'next/navigation'async function fetchTeam(id: string) {const res = await fetch('https://...')if (!res.ok) return undefinedreturn res.json()
}export default async function Profile({params,
}: {params: Promise<{ id: string }>
}) {const { id } = await paramsif (!id) {redirect('/login')}const team = await fetchTeam(id)if (!team) {redirect('/join')}// ...
}
- redirect 默认返回 307(临时重定向)状态代码。当在服务器操作中使用时,它会返回 303(请参阅其他),通常用于由于 POST 请求而重定向到成功页面。
- 如果你想在渲染过程之前重定向,可以使用 next.config.js 或 中间件。
中间件
中间件允许你在请求完成之前运行代码。然后,根据传入的请求,你可以通过重写、重定向、修改请求或响应标头或直接响应来修改响应。
中间件在缓存内容和路由匹配之前运行。
常见应用场景
- 读取部分传入请求后快速重定向
- 根据A/B测试或实验重写到不同的页面
- 修改所有页面或部分页面的标题
- 拦截请求,实现鉴权、日志
中间件中的 NextResponse
- redirect 传入请求到不同的 URL
- rewrite 通过显示给定 URL 进行响应
- 设置 API 路由,getServerSideProps 和 rewrite 目标的请求标头。
- 设置响应 cookie
- 设置响应标头
中间件的重定向应用
1. 鉴权
中间件允许你在请求完成之前运行代码。然后,根据传入请求,使用 NextResponse.redirect 重定向到不同的 URL。如果你想根据条件(例如身份验证、会话管理等)重定向用户或有大量重定向(非登录页验证 token)。
例如,如果用户未通过身份验证,则将用户重定向到 /login 页面:
```
import { NextResponse, NextRequest } from 'next/server'
import { authenticate } from 'auth-provider'export function middleware(request: NextRequest) {const isAuthenticated = authenticate(request)// If the user is authenticated, continue as normalif (isAuthenticated) {return NextResponse.next()}// Redirect to login page if not authenticatedreturn NextResponse.redirect(new URL('/login', request.url))
}export const config = {matcher: '/dashboard/:path*',
}
```
- 中间件在 redirects 之后、next.config.js 中、渲染之前运行。
- 拦截请求
export function middleware(request) {if (!request.cookies.has('token')) {return Response.redirect(new URL('/login', request.url));}
}
4. 原生 history API
除了 Next.js 提供的路由功能外,你还可以使用浏览器的原生 History API 进行路由跳转。这种方式适用于需要更细粒度控制路由历史的情况,不会重新加载页面。
export default function Page() {return (<button type="button" onClick={() => window.history.pushState({}, '', '/dashboard')}>Dashboard</button>);
}
三、动态路由
Next.js 提供了强大的动态路由功能,允许开发者根据动态参数生成页面。
1. 概念
动态路由允许你根据动态参数生成页面。例如,一个博客网站可能需要为每篇文章生成一个单独的页面,而文章的 ID 是动态的。通过动态路由,你可以使用一个页面模板来处理所有这些动态页面。
2. 创建动态路由
在 Next.js 中,动态路由通过在页面文件名中使用方括号 [] 来定义。例如,如果你有一个页面文件名为 [id].js,那么这个页面将能够处理所有类似 /123、/456 的路径,其中 123 和 456 是动态参数。
pages/
├── posts/
│ └── [id].js
└── users/└── [username].js
获取动态参数
在动态路由页面中,你可以通过 useRouter 钩子或 getServerSideProps、getStaticProps 等方法来获取动态参数。
特性 | useRouter 钩子 | getServerSideProps | getStaticProps |
---|---|---|---|
使用环境 | 仅客户端 | 仅服务端 | 仅构建时 |
获取参数方式 | const { id } = useRouter().query | context.params | context.params |
数据获取时机 | 客户端渲染时 | 每次请求时 | 构建时 |
SEO 友好性 | 较差(客户端渲染) | 优秀(服务端渲染) | 优秀(静态生成) |
性能影响 | 客户端解析,影响较小 | 每次请求都执行,影响较大 | 仅构建时执行,运行时无负担 |
适用场景 | 不需要SEO的交互部分 | 需要实时数据的页面 | 内容不频繁变化的页面 |
类型支持 | 需要手动类型断言 | 自动推断类型 | 自动推断类型 |
静态生成支持 | 不适用 | 不适用 | 支持,需配合 getStaticPaths |
访问请求对象 | 不可访问 | 可通过 context.req 访问 | 不可访问 |
访问响应对象 | 不可访问 | 可通过 context.res 访问 | 不可访问 |
重定向处理 | 使用 router.push | 可在函数内返回 redirect 对象 | 可在函数内返回 redirect 对象 |
重新验证支持 | 不适用 | 不适用 | 支持 revalidate 参数 |
预渲染行为 | 客户端渲染 | 服务端渲染 | 静态生成 |
动态路由必需配置 | 不需要 | 不需要 | 需要 getStaticPaths |
策略流程图
四、并行路由
并行路由允许您在同一视口中:
- 同时显示多个页面内容
- 独立控制每个路由的加载状态
- 实现条件渲染(如基于权限的视图)
与传统路由的区别:
特性 | 嵌套路由 | 并行路由 |
---|---|---|
渲染方式 | 父子层级关系 | 同级并行关系 |
URL结构 | /parent/child | 共享同一URL路径 |
组件更新 | 全页面刷新 | 独立局部更新 |
用例 | 标准页面层级 | 仪表盘、多视图布局 |
实现方式
- 并行路由是由命名插槽创建的,使用 @slot-name 格式命名文件夹。
- 在需要的 layout 页面并行使用即可,需要注意的是要先通过 props 引入插槽名才可以使用。
示例如下,以下文件结构定义了两个槽:@analytics 和 @team:
插槽作为属性传递给共享父布局。对于上面的示例,app/layout.js 中的组件现在接受 @analytics 和 @team slot 属性,并且可以与 children 属性一起并行渲染它们:
export default function Layout({children,team,analytics,
}: {children: React.ReactNodeanalytics: React.ReactNodeteam: React.ReactNode
}) {return (<>{children}{team}{analytics}</>)
}
性能优化建议
- 对不常变化的插槽使用 React.memo
- 为复杂插槽添加独立 loading 状态
- 使用 prefetch 预加载关键路由
相关文章:

Next.js路由导航完全指南
在前端框架(如 React、Vue 等)或移动端开发中,路由系统是实现页面 / 界面导航的核心机制。Next.js 采用 文件系统路由(File System Routing),即根据项目目录结构自动生成路由。 Next.js 目前有两套路由解决…...

五、web安全--XSS漏洞(1)--XSS漏洞利用全过程
本文章仅供学习交流,如作他用所承受的法律责任一概与作者无关1、XSS漏洞利用全过程 1.1 寻找注入点:攻击者首先需要找到目标网站中可能存在XSS漏洞的注入点。这些注入点通常出现在用户输入能够直接输出到页面,且没有经过适当过滤或编码的地方…...

【C++高级主题】命令空间(六):重载与命名空间
目录 一、候选函数与命名空间:重载的 “搜索范围” 1.1 重载集的构成规则 1.2 命名空间对候选函数的隔离 二、重载与using声明:精准引入单个函数 2.1 using声明与重载的结合 2.2 using声明的冲突处理 三、重载与using指示:批量引入命名…...
利用 Python 爬虫获取淘宝商品详情
在电商领域,淘宝作为中国最大的在线零售平台,拥有海量的商品信息。对于开发者、市场分析师以及电商研究者来说,能够从淘宝获取商品详情信息,对于市场分析、价格比较、商品推荐等应用场景具有重要价值。本文将详细介绍如何使用 Pyt…...
动态拼接内容
服务器端模板引擎(Server-Side Template Engine) 的特性,比如 JSP(Java Server Pages)、ASP.NET、PHP 等技术中常用的 <% %> 语法。 它的核心作用是: 动态拼接内容:在 HTML 中嵌入编程语…...

Tomcat运行比较卡顿进行参数调优
在Tomcat conf/catalina.bat或catalina.sh中 的最上面增加参数 1. 初步调整参数(缓解问题) set JAVA_OPTS -Xms6g -Xmx6g -Xmn3g # 增大新生代,减少对象过早晋升到老年代 -XX:MetaspaceSize256m -XX:MaxMetaspaceS…...
java直接获取MyBatis将要执行的动态sql命令(不是拦截器方式)
目录 前言 一. 准备数据 1. 传输过来的json条件数据 2. mybatis 配置的动态sql 3. 想要的最终会执行的sql并返回给页面展示 二. 实现方式 三. 最终代码 前言 1.在平常开发过程中,MyBatis使用时非常多的,一般情况下我们只需要在控制台看看MyBatis输出的日志,要不就是实…...

C++四种类型转换方式
const_cast,去掉(指针或引用)常量属性的一个类型转换,但需要保持转换前后类型一致static_cast,提供编译器认为安全的类型转换(最常使用)reinterpret_cast,类似于c语言风格的强制类型转换,不保证安全;dynamic_cast,主要用于继承结构中…...

Canvas: trying to draw too large(256032000bytes) bitmap.
1、错误展示 测试了一下一张图片的显示,发现二个手机上测试的结果不一样,配制好一些的手机,直接就通过,但是屏小一些的测试手机上,直接报下面的错误。 这个意思是图片太大了,直接就崩了。 2、代码编写 lo…...
【深度学习-pytorch篇】5. 卷积神经网络与LLaMA分类模型
卷积神经网络与LLaMA分类模型 一、卷积操作基础 卷积是深度学习中用于提取局部特征的核心操作,特别适用于图像识别任务。 自定义二维卷积函数示例 以下函数实现了一个简化版的二维卷积: def convolve2D(image, kernel, padding0, strides1):kernel …...
matlab全息技术中的菲涅尔仿真成像
matlab全息技术中的菲涅尔仿真成像程序。 傅里叶法(重建距离得大)/Fresnel.m , 545 傅里叶法(重建距离得大)/FresnelB.m , 548 傅里叶法(重建距离得大)/Fresnel_solution.m , 1643 傅里叶法(重…...
基于对比学习的推荐系统开发方案,使用Python在PyCharm中实现
以下是一个基于对比学习的推荐系统开发方案,使用Python在PyCharm中实现。本文将详细阐述技术原理、系统设计和完整代码实现。 基于对比学习的推荐系统开发方案 一、技术背景与原理 1.1 对比学习核心思想 对比学习(Contrastive Learning)通过最大化正样本相似度、最小化负…...

网络协议之办公室网络是怎样的?
写在前面 本文来看下办公室网络怎样的。 1:正文 如果是在一个寝室中组件一个局域网还是比较简单的,只需要一个交换机,然后大家的电脑全部连接到这个交换机上就行了,之后所有的电脑设置CIDR保证在一个局域网就可以了。但是&#…...
鸿蒙OSUniApp PWA开发实践:打造跨平台渐进式应用#三方框架 #Uniapp
UniApp PWA开发实践:打造跨平台渐进式应用 前言 在过去的一年里,我们团队一直在探索如何利用UniApp框架开发高性能的PWA应用。特别是随着鸿蒙系统的普及,我们积累了不少有价值的实践经验。本文将分享我们在开发过程中的技术选型、架构设计和…...

uni-data-picker级联选择器、fastadmin后端api
记录一个部门及部门人员选择的功能,效果如下: 组件用到了uni-ui的级联选择uni-data-picker 开发文档:uni-app官网 组件要求的数据格式如下: 后端使用的是fastadmin,需要用到fastadmin自带的tree类生成部门树 &#x…...

8天Python从入门到精通【itheima】-62~63
目录 第六章开始-62节-数据容器入门 1.学习目标 2.为什么要学习数据容器? 3.什么是Python中的数据容器 4.小节总结 63节-列表的定义语法 1.学习目标 2.为什么需要列表? 3.列表定义的基本语法 4.列表定义的基本语法-案例演示 5.列表定义的基本语…...
运维 pgsql 安装完后某次启动不了
pgsql 安装完后某次启动不了 错误 data directory "/usr/local/postgresql/data" has invalid permissions 安装成功后一直可以 后面同事敲了 chmod -R 777 /usr/local 导致不行 改到了 /usr/local/postgresql/data 权限 /usr/local/postgresql/data的权限有限…...

Linux基本指令/下
目录 1.echo、cat与printf 2. > 操作符 与 >> 操作符 3. < 操作符 4.消息传送 linux文件深入 5.文件类型 6.mv命令 7.时间相关指令 8.查找命令 9.grep命令 10.zip/unzip/tar命令 11.scp命令 12.bc命令 13.uname 指令 14.快捷键大全 15.关机/重启/睡…...

matlab中绘图函数plot
MATLAB中的plot函数:数据可视化的强大工具 引言 在科学计算和工程领域,数据可视化是理解和分析数据的关键步骤。MATLAB作为一款强大的数值计算软件,提供了丰富的绘图功能,其中plot函数是最基础、最常用的二维图形绘制工具。本文…...

在线音乐服务器测试报告
1.项目背景 此项目主要用于模拟市面上主流的音乐软件的主要功能,提高自己的开发和测试能力。此项目采用的技术栈是SpringBoot MyBatis SpringMVC Mysql实现的,为了实现简单,方便测试,此项目没有注册功能,数据提前存…...
spark-AQE/Tungsten介绍及其触发条件
目录 1、简介2、AQE(自适应查询优化)触发条件及配置3、Tungsten(钨丝计划)触发条件及配置1、简介 AQE(Adaptive Query Execution) 定义:Spark 3.0引入的自适应查询优化技术,运行时动态调整执行计划。核心能力: 动态分区合并:自动合并小分区以减少Shuffle数据量。自动…...

leetcode-hot-100 (矩阵)
1、矩阵置零 题目链接:矩阵置零 题目描述:给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 解答 方法一:使用一个二维数组 这是我看到这道题目的第一个想法&am…...
深度学习中常见的超参数对系统的影响
目录 一,学习率(Learning Rate) 1.1 学习率的本质:控制模型 “学习步伐” 的核心参数 1.2 学习率高低的具体影响:过犹不及的典型后果 1.3 学习率调整策略:3 个实用技巧 二,批次大小&#x…...

评标专家系统随机抽选 开发 Excel 中使用东方仙盟软件助理——未来之窗——仙盟创梦IDE
评标专家抽取系统是针对建设项目与采购招投标,从专家库中随机抽取参与评标专家,并自动进行语音通知的管理软件。符合《中华人民共和国招标投标法》及发改委颁布的《评标专家和评标专家库管理暂行办法》;操作简便、保密性强。 软件根据设定抽取…...
MySQL、PostgreSQL、Oracle 区别详解
MySQL、PostgreSQL、Oracle 区别详解 一、基础架构对比 1.1 数据库类型 MySQL:关系型数据库(支持NoSQL插件如MySQL Document Store)PostgreSQL:对象-关系型数据库(支持JSON等半结构化数据)Oracle:多模型数据库(关系型+文档+图+空间等)关键结论:PostgreSQL在数据类型…...

【第4章 图像与视频】4.6 结合剪辑区域来绘制图像
文章目录 前言示例 前言 本节将综合运用图像处理、离屏 canvas 以及剪辑区域等技术实现墨镜效果。 示例 主线程代码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport&qu…...

【Linux】Linux文件系统详解
目录 Linux系统简介 Linux常见发行版: Linux/windows文件系统区别 Linux文件系统各个目录用途 Linux系统核心文件 系统核心配置文件 用户与环境配置文件 系统运行与日志文件 Linux文件名颜色含义 Linux文件关键信息解析 🔥个人主页 ὒ…...

IDEA使用Git进行commit提交到本地git空间后撤回到commit版本之前
一、前言 Git作为最流行和最全面的版本控制工具,非常好用,但是操作也会比SVN复杂一些。毕竟有得有失嘛,所以我选择Git,最近在工作中,一不小心吧一些无关紧要的文件commit了。还好在Push之前看到,不过就算P…...

LangChain完全指南:从入门到精通,打造AI应用开发新范式
目录 1. 引言2. LangChain 框架概述3. 架构设计与模块划分4. 核心原理深度解析5. 工作流程与执行过程6. 扩展与定制7. 性能优化策略8. 实际应用案例9. 常见问题与解决方案10. 未来发展与展望11. 总结12. 参考文献与资源 1. 引言 1.1 LangChain 简介 LangChain 是一个开源的…...
深入解析Vue.js:构建现代Web应用的高效之道
一、Vue.js 的核心设计理念 Vue.js 以渐进式框架为定位,强调轻量灵活与易上手性,允许开发者根据项目需求逐步引入核心功能或扩展模块。其核心设计遵循以下原则: 响应式数据绑定:通过数据劫持(Object.defineProperty/Proxy)和发布 - 订阅模式,实现视图与数据的自动同步,…...