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

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 RouterApp 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 中、渲染之前运行。
  1. 拦截请求
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 钩子getServerSidePropsgetStaticProps
使用环境仅客户端仅服务端仅构建时
获取参数方式const { id } = useRouter().querycontext.paramscontext.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路由导航完全指南

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

五、web安全--XSS漏洞(1)--XSS漏洞利用全过程

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

【C++高级主题】命令空间(六):重载与命名空间

目录 一、候选函数与命名空间&#xff1a;重载的 “搜索范围” 1.1 重载集的构成规则 1.2 命名空间对候选函数的隔离 二、重载与using声明&#xff1a;精准引入单个函数 2.1 using声明与重载的结合 2.2 using声明的冲突处理 三、重载与using指示&#xff1a;批量引入命名…...

利用 Python 爬虫获取淘宝商品详情

在电商领域&#xff0c;淘宝作为中国最大的在线零售平台&#xff0c;拥有海量的商品信息。对于开发者、市场分析师以及电商研究者来说&#xff0c;能够从淘宝获取商品详情信息&#xff0c;对于市场分析、价格比较、商品推荐等应用场景具有重要价值。本文将详细介绍如何使用 Pyt…...

动态拼接内容

服务器端模板引擎&#xff08;Server-Side Template Engine&#xff09; 的特性&#xff0c;比如 JSP&#xff08;Java Server Pages&#xff09;、ASP.NET、PHP 等技术中常用的 <% %> 语法。 它的核心作用是&#xff1a; 动态拼接内容&#xff1a;在 HTML 中嵌入编程语…...

Tomcat运行比较卡顿进行参数调优

在Tomcat conf/catalina.bat或catalina.sh中 的最上面增加参数 1. 初步调整参数&#xff08;缓解问题&#xff09; set JAVA_OPTS -Xms6g -Xmx6g -Xmn3g # 增大新生代&#xff0c;减少对象过早晋升到老年代 -XX:MetaspaceSize256m -XX:MaxMetaspaceS…...

java直接获取MyBatis将要执行的动态sql命令(不是拦截器方式)

目录 前言 一. 准备数据 1. 传输过来的json条件数据 2. mybatis 配置的动态sql 3. 想要的最终会执行的sql并返回给页面展示 二. 实现方式 三. 最终代码 前言 1.在平常开发过程中,MyBatis使用时非常多的,一般情况下我们只需要在控制台看看MyBatis输出的日志,要不就是实…...

C++四种类型转换方式

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

Canvas: trying to draw too large(256032000bytes) bitmap.

1、错误展示 测试了一下一张图片的显示&#xff0c;发现二个手机上测试的结果不一样&#xff0c;配制好一些的手机&#xff0c;直接就通过&#xff0c;但是屏小一些的测试手机上&#xff0c;直接报下面的错误。 这个意思是图片太大了&#xff0c;直接就崩了。 2、代码编写 lo…...

【深度学习-pytorch篇】5. 卷积神经网络与LLaMA分类模型

卷积神经网络与LLaMA分类模型 一、卷积操作基础 卷积是深度学习中用于提取局部特征的核心操作&#xff0c;特别适用于图像识别任务。 自定义二维卷积函数示例 以下函数实现了一个简化版的二维卷积&#xff1a; def convolve2D(image, kernel, padding0, strides1):kernel …...

matlab全息技术中的菲涅尔仿真成像

matlab全息技术中的菲涅尔仿真成像程序。 傅里叶法&#xff08;重建距离得大&#xff09;/Fresnel.m , 545 傅里叶法&#xff08;重建距离得大&#xff09;/FresnelB.m , 548 傅里叶法&#xff08;重建距离得大&#xff09;/Fresnel_solution.m , 1643 傅里叶法&#xff08;重…...

基于对比学习的推荐系统开发方案,使用Python在PyCharm中实现

以下是一个基于对比学习的推荐系统开发方案,使用Python在PyCharm中实现。本文将详细阐述技术原理、系统设计和完整代码实现。 基于对比学习的推荐系统开发方案 一、技术背景与原理 1.1 对比学习核心思想 对比学习(Contrastive Learning)通过最大化正样本相似度、最小化负…...

网络协议之办公室网络是怎样的?

写在前面 本文来看下办公室网络怎样的。 1&#xff1a;正文 如果是在一个寝室中组件一个局域网还是比较简单的&#xff0c;只需要一个交换机&#xff0c;然后大家的电脑全部连接到这个交换机上就行了&#xff0c;之后所有的电脑设置CIDR保证在一个局域网就可以了。但是&#…...

鸿蒙OSUniApp PWA开发实践:打造跨平台渐进式应用#三方框架 #Uniapp

UniApp PWA开发实践&#xff1a;打造跨平台渐进式应用 前言 在过去的一年里&#xff0c;我们团队一直在探索如何利用UniApp框架开发高性能的PWA应用。特别是随着鸿蒙系统的普及&#xff0c;我们积累了不少有价值的实践经验。本文将分享我们在开发过程中的技术选型、架构设计和…...

uni-data-picker级联选择器、fastadmin后端api

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

8天Python从入门到精通【itheima】-62~63

目录 第六章开始-62节-数据容器入门 1.学习目标 2.为什么要学习数据容器&#xff1f; 3.什么是Python中的数据容器 4.小节总结 63节-列表的定义语法 1.学习目标 2.为什么需要列表&#xff1f; 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函数&#xff1a;数据可视化的强大工具 引言 在科学计算和工程领域&#xff0c;数据可视化是理解和分析数据的关键步骤。MATLAB作为一款强大的数值计算软件&#xff0c;提供了丰富的绘图功能&#xff0c;其中plot函数是最基础、最常用的二维图形绘制工具。本文…...

在线音乐服务器测试报告

1.项目背景 此项目主要用于模拟市面上主流的音乐软件的主要功能&#xff0c;提高自己的开发和测试能力。此项目采用的技术栈是SpringBoot MyBatis SpringMVC Mysql实现的&#xff0c;为了实现简单&#xff0c;方便测试&#xff0c;此项目没有注册功能&#xff0c;数据提前存…...

spark-AQE/Tungsten介绍及其触发条件

目录 1、简介2、AQE(自适应查询优化)触发条件及配置3、Tungsten(钨丝计划)触发条件及配置1、简介 AQE(Adaptive Query Execution) 定义:Spark 3.0引入的自适应查询优化技术,运行时动态调整执行计划。核心能力: 动态分区合并:自动合并小分区以减少Shuffle数据量。自动…...

leetcode-hot-100 (矩阵)

1、矩阵置零 题目链接&#xff1a;矩阵置零 题目描述&#xff1a;给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 解答 方法一&#xff1a;使用一个二维数组 这是我看到这道题目的第一个想法&am…...

深度学习中常见的超参数对系统的影响

目录 一&#xff0c;学习率&#xff08;Learning Rate&#xff09; 1.1 学习率的本质&#xff1a;控制模型 “学习步伐” 的核心参数 1.2 学习率高低的具体影响&#xff1a;过犹不及的典型后果 1.3 学习率调整策略&#xff1a;3 个实用技巧 二&#xff0c;批次大小&#x…...

评标专家系统随机抽选 开发 Excel 中使用东方仙盟软件助理——未来之窗——仙盟创梦IDE

评标专家抽取系统是针对建设项目与采购招投标&#xff0c;从专家库中随机抽取参与评标专家&#xff0c;并自动进行语音通知的管理软件。符合《中华人民共和国招标投标法》及发改委颁布的《评标专家和评标专家库管理暂行办法》&#xff1b;操作简便、保密性强。 软件根据设定抽取…...

MySQL、PostgreSQL、Oracle 区别详解

MySQL、PostgreSQL、Oracle 区别详解 一、基础架构对比 1.1 数据库类型 MySQL:关系型数据库(支持NoSQL插件如MySQL Document Store)PostgreSQL:对象-关系型数据库(支持JSON等半结构化数据)Oracle:多模型数据库(关系型+文档+图+空间等)关键结论:PostgreSQL在数据类型…...

【第4章 图像与视频】4.6 结合剪辑区域来绘制图像

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

【Linux】Linux文件系统详解

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

IDEA使用Git进行commit提交到本地git空间后撤回到commit版本之前

一、前言 Git作为最流行和最全面的版本控制工具&#xff0c;非常好用&#xff0c;但是操作也会比SVN复杂一些。毕竟有得有失嘛&#xff0c;所以我选择Git&#xff0c;最近在工作中&#xff0c;一不小心吧一些无关紧要的文件commit了。还好在Push之前看到&#xff0c;不过就算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)和发布 - 订阅模式,实现视图与数据的自动同步,…...