Next.js 系统性教学:加载界面、重定向与路由分组

 更多有关Next.js教程,请查阅:

【目录】Next.js 独立开发系列教程-CSDN博客


目录

1. 加载界面与流式渲染

1.1 加载界面 (loading.js)

1.2 流式渲染

2. 路由重定向

2.1 基于服务器的重定向

2.2 动态重定向

2.3 中间件中的重定向

3. 路由分组

3.1 路由分组的基本使用

3.2 在分组中共享布局

3.3 嵌套分组

3.4 匿名路由分组

4. 最佳实践

5. 总结

 独立开发系列文章目录

Next.js系统性学习系列文章目录


Next.js 提供了一套强大且灵活的路由系统,帮助开发者快速构建现代化 Web 应用。本教程将围绕 加载界面与流式渲染重定向以及路由分组展开深入讲解,助您掌握这些工具并提升开发效率和用户体验。


1. 加载界面与流式渲染

现代 Web 应用对性能和用户体验的要求越来越高。Next.js 通过加载界面和流式渲染提供了更好的体验,确保页面内容以最快的速度呈现给用户。

1.1 加载界面 (loading.js)

loading.js 文件允许开发者为某个路由或页面定义一个加载状态。当页面内容尚未完全加载时,loading.js 中的组件会被显示,直到加载完成。

目录结构:

app/
├── dashboard/
│   ├── page.js
│   ├── loading.js

示例代码:app/dashboard/loading.js

export default function Loading() {return <p>正在加载,请稍候...</p>;
}
  • 当用户访问 /dashboard 时,如果数据或页面仍在加载,浏览器会优先显示 loading.js 中的内容。
  • 此机制提高了用户体验,避免长时间的白屏等待。

1.2 流式渲染

Next.js 支持流式渲染 (Streaming),允许服务器将页面部分内容先行返回并呈现,而不是等待所有数据加载完成。这对于加载大数据量的页面非常有用。

示例代码:app/page.js

export default async function HomePage() {const data = await fetchSomeData(); // 假设这是一个耗时的操作return (<main><h1>首页</h1>{data.map((item) => (<p key={item.id}>{item.name}</p>))}</main>);
}
  • 页面在获取 fetchSomeData() 数据时,可以先渲染其他部分,如 h1 标题。
  • 这使得用户可以快速看到部分页面内容,而无需等待完整数据。

2. 路由重定向

路由重定向是 Web 开发中的常见需求,例如在用户登录后将其重定向到仪表盘页面,或者为旧的 URL 提供新的跳转目标。Next.js 提供多种方式实现路由重定向。

2.1 基于服务器的重定向

服务器端重定向可以通过在 app 目录的 page.js 文件中使用 redirect() 方法实现。

示例代码:app/page.js

import { redirect } from "next/navigation";export default function HomePage() {const isLoggedIn = false; // 假设这是登录状态检查if (!isLoggedIn) {redirect("/login");}return <h1>欢迎回来!</h1>;
}
  • redirect():将用户直接导航到指定路径。
  • 此方法适用于需要根据某些条件进行页面跳转的场景,例如权限验证。

2.2 动态重定向

Next.js 支持动态路径的重定向,例如将 /old-page 重定向到 /new-page

示例代码:next.config.js

module.exports = {async redirects() {return [{source: "/old-page",destination: "/new-page",permanent: true,},];},
};
  • source:定义旧路径。
  • destination:定义目标路径。
  • permanent:如果为 true,会返回 HTTP 状态码 308,适用于永久性跳转。

这种配置适合全局的静态重定向需求,且与服务器无关。


2.3 中间件中的重定向

Next.js 中间件 (Middleware) 提供了基于请求的动态处理能力,适合更复杂的场景。

示例代码:middleware.js

import { NextResponse } from "next/server";export function middleware(req) {const url = req.nextUrl.clone();if (url.pathname === "/old-path") {url.pathname = "/new-path";return NextResponse.redirect(url);}
}

此方法允许开发者在应用逻辑中动态地管理请求路径和跳转。


3. 路由分组

Next.js 的路由分组功能可以组织复杂的应用目录结构,同时保持 URL 的清晰简洁。它通过 ( ) 包裹目录名实现分组,而不会影响最终生成的 URL。

3.1 路由分组的基本使用

目录结构:

app/
├── (dashboard)/
│   ├── layout.js
│   ├── analytics/
│   │   ├── page.js
│   ├── sales/
│   │   ├── page.js
├── page.js
  • (dashboard) 是一个分组目录,不会出现在 URL 路径中。
  • /analytics/sales 会分别解析为 https://example.com/analyticshttps://example.com/sales

3.2 在分组中共享布局

可以为整个分组定义一个共享布局,提升代码复用性。

示例代码:app/(dashboard)/layout.js

export default function DashboardLayout({ children }) {return (<section><aside>仪表盘菜单</aside><main>{children}</main></section>);
}
  • 分组内所有页面都会继承 DashboardLayout 的结构和样式。

3.3 嵌套分组

Next.js 允许在分组中嵌套其他分组,便于构建复杂的页面结构。

目录结构:

app/
├── (marketing)/
│   ├── blog/
│   │   ├── page.js
│   ├── about/
│   │   ├── page.js
├── (dashboard)/
│   ├── settings/
│   │   ├── page.js
│   ├── profile/
│   │   ├── page.js
  • (marketing)(dashboard) 是两个独立的分组,各自管理自己的页面。
  • 嵌套分组可以进一步细化应用逻辑。

3.4 匿名路由分组

匿名路由分组是使用 () 包裹的分组目录,但不会对外暴露任何路径。例如:

目录结构:

app/
├── (shared-layout)/
│   ├── layout.js
├── dashboard/
│   ├── page.js
  • (shared-layout) 中的内容会被 dashboard 和其他页面共享,但它不会影响 URL 路径。

4. 最佳实践

  1. 流畅加载界面:为每个关键路由定义 loading.js,减少用户等待时的感知延迟。
  2. 精准重定向:根据需求选择动态重定向或全局静态配置,避免复杂的路径管理。
  3. 灵活分组:利用路由分组简化复杂目录结构,同时保持 URL 的简洁。
  4. 流式渲染优先:对于大数据页面,优先采用流式渲染,提升用户体验。

5. 总结

Next.js 在加载界面、重定向与路由分组方面提供了强大且灵活的功能。这些特性不仅提高了开发效率,也优化了用户体验。通过合理运用这些工具,开发者可以构建出结构清晰、性能优越的现代 Web 应用。

 更多有关Next.js教程,请查阅:

【目录】Next.js 独立开发系列教程-CSDN博客

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

selenium+python实现12306自动化抢火车票(二)

往期回顾&#xff1a; seleniumpython实现12306自动化抢火车票&#xff08;一&#xff09; 1、根据乘车人姓名匹配&#xff0c;支持1人或多人选择 定位出所有乘车人的元素集&#xff0c;根据姓名集合去元素集里循环迭代匹配&#xff0c;匹配上了操作选中 ele_alldriver.find_e…

基于openzeppelin插件的智能合约升级

一、作用以及优点 部署可升级合约&#xff0c;插件自动部署proxy和proxyAdmin合约&#xff0c;帮助管理合约升级和交互&#xff1b;升级已部署合约&#xff0c;通过插件快速升级合约&#xff0c;脚本开发方便快捷&#xff1b;管理代理管理员的权限&#xff0c;只有proxyAdmin的…

游戏引擎学习第36天

仓库 :https://gitee.com/mrxiao_com/2d_game 回顾之前的内容 在这个程序中&#xff0c;目标是通过手动编写代码来从头开始制作一个完整的游戏。整个过程不使用任何库或现成的游戏引擎&#xff0c;这样做的目的是为了能够全面了解游戏执行的每一个细节。开发过程中&#xff0…

MySQL-设置utf8mb4字符集以支持全面的字符显示

本文主要介绍如何通过统一使用utf8mb4字符集来实现在MySQL实例中存储emoji表情的最佳实践。 我们将从客户端、会话连接和MySQL实例等多个方面介绍如何配置和修改字符集以支持utf8mb4。 客户端和会话连接的字符集配置 为了确保能够正确存储和显示emoji表情&#xff0c;我们首…

【Linux从青铜到王者】数据链路层(mac,arp)以及ip分片

局域网通信 通过之前的学习&#xff0c;我们了解了应用层&#xff0c;传输层&#xff0c;网络层的协议和作用&#xff0c;这里先做个总结 应用层——http&#xff0c;https协议&#xff0c;也可以自己定义一套&#xff0c;作用是进行数据的处理传输层——tcp&#xff0c;udp协…

基于STM32的风速风向传感器设计

目录 引言系统设计 硬件设计软件设计系统功能模块 风速采集模块风向采集模块数据处理与显示模块控制算法 风速数据处理算法风向数据处理算法代码实现 风速数据采集与处理风向数据采集与处理数据显示与通信系统调试与优化结论与展望 1. 引言 随着气象监测需求的增加&#xff0…

13.在 Vue 3 中使用OpenLayers加载鹰眼控件示例教程

在 WebGIS 开发中&#xff0c;鹰眼控件 是一个常用的功能&#xff0c;它可以为用户提供当前地图位置的概览&#xff0c;帮助更好地定位和导航。在本文中&#xff0c;我们将基于 Vue 3 的 Composition API 和 OpenLayers&#xff0c;创建一个简单的鹰眼控件示例。 效果预览 在最…

安装certbot(ubuntu系统)

安装nginx 更新软件包列表 sudo apt update 更新软件包列表 sudo apt install nginx 更新软件包列表 sudo systemctl status nginx 注意&#xff1a;强烈推荐使用&#xff0c;系统直接安装nginx&#xff0c;&#xff08;不推荐使用docker安装nginx&#xff09;为后续更简单…

【C语言】C语言的变量和声明系统性讲解

声明和定义的概念 在C语言中&#xff0c;**声明&#xff08;Declaration&#xff09;和定义&#xff08;Definition&#xff09;**是两个重要的基础概念&#xff0c;它们都涉及到变量、函数、结构体等的使用&#xff0c;但功能和作用存在明显区别&#xff1a; 声明&#xff1a…

【Linux】文件的内核级缓冲区、重定向、用户级缓冲区(详解)

一.文件内核级缓冲区 在一个struct file内部还要有一个数据结构-----文件的内核级缓冲区 打开文件&#xff0c;为我们创建struct file&#xff0c;与该文件的所对应的操作表函数指针集合&#xff0c;还要提供一个文件的内核级缓冲区 1.write写入具体操作 当我们去对一个文件写…

MCU、ARM体系结构,单片机基础,单片机操作

计算机基础 计算机的组成 输入设备、输出设备、存储器、运算器、控制器 输入设备&#xff1a;将其他信号转换为计算机可以识别的信号&#xff08;电信号&#xff09;。输出设备&#xff1a;将电信号&#xff08;&#xff10;、&#xff11;&#xff09;转为人或其他设备能理解的…

JDK8新特性之Stream流01

Stream 流介绍 目标 了解集合的处理数据的弊端 理解Stream流的思想和作用 集合处理数据的弊端 当我们需要对集合中的元素进行操作的时候&#xff0c;除了必须的添加&#xff0c;删除&#xff0c;获取外&#xff0c;最典型的就是遍历集合。我们来体验集合操作的弊端&#xff…

【C++】—— map 与 multimap

【C】—— map 与 multimap 1 map1.1 map 和 multimap 参考文档1.2 map 类的介绍1.3 pair 类型介绍1.4 map的构造1.5 map的插入1.5.1 map 的插入方法1.5.2 验证1.5.3 再探pair1.5.4 make_pair 1.6 operator[]1.6.1 样例1.6.2 认识operator[]1.6.3 operator[] 的功能 1.7 map 的…

VTK知识学习(20)- 数据的存储与表达

1、数据的存储 1)、vtkDataArray VTK中的内存分配采用连续内存&#xff0c;可以快速地创建、删除和遍历&#xff0c;称之为数据数组(DataArray)&#xff0c;用类 vtkDataArray 实现。数组数据的访问是基于索引的&#xff0c;从零开始计数。 以 vtkFloatArray 类来说明如何在 …

HCIP-以太网交换安全

端口隔离&#xff1a;实现同一VLAN下的不同用户在二层不能互通&#xff08;可以实现在三层互通&#xff09;&#xff0c;同一个隔离组内是相互隔离的&#xff0c; MAC地址表功能&#xff1a;动态MAC地址表项&#xff0c;接口通告报文中的源MAC地址学习获得&#xff0c;表项可老…

电机功率、电压与电流的换算方法

在电气工程和相关行业中&#xff0c;电机的功率、电压和电流是三个重要的基本参数。它们之间有着密切的关系&#xff0c;而理解这些关系对于电机的选型、设计和应用至关重要。本文将详细阐述这三者之间的换算关系&#xff0c;以及相关公式的应用。 一、电机功率的定义 电机功…

【CKS最新模拟真题】获取多个集群的上下文名称并保存到指定文件中

文章目录 前言一、TASK二、解题过程1、问题一解题2、问题二解题 前言 月底考CKS,这是最新版的CKS模拟题 环境k8s版本ubuntu1.31 一、TASK 题目要求 Solve this question on: ssh cks3477 You have access to multiple clusters from your main terminal through contexts. …

智能合约的离线签名(EIP712协议)解决方案

一、解决核心问题 项目方不支付gas费&#xff0c;由用户自己发起交易&#xff0c;用户支付gas费。用户的数据保存在链下服务器中&#xff0c;token合约在链上&#xff0c;交易是由用户通过网页的DAPP发起。 后台服务、token合约、dapp如何配合工作是本方案的重点 二、总架构…

php:完整部署Grid++Report到php项目,并实现模板打印

一、下载Grid++Report软件 路径:开发者安装包下载 - 锐浪报表工具 二、 安装软件 1、对下载的压缩包运行内部的exe文件 2、选择语言 3、 完成安装引导 下一步即可 4、接收许可协议 点击“我接受” 5、选择安装路径 “浏览”选择安装路径,点击"安装" 6、完成…

SpringMvc完整知识点一

SpringMVC概述 定义 SpringMVC是一种基于Java实现MVC设计模型的轻量级Web框架 MVC设计模型&#xff1a;即将应用程序分为三个主要组件&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controller&#xff09;。这种分离…