Next.js - app 路由器之动态路由与并行路由

#题引:我认为跟着官方文档学习不会走歪路

动态路由的约定

(1) 通过将文件夹名称用方括号括起来可以创建动态段:[folderName]

动态段会作为 params 属性传递给 layout、page、route 和 generateMetadata 函数。

例如,一个博客可以包含以下路由 app/blog/[slug]/page.js,其中 [slug] 是博客文章的动态段。slug是这个动态段的名称,可以被任意有效的 URL 部分替代

export default async function Page({
  params,
}: {
  params: Promise<{ slug: string }>
}) {
  const slug = (await params).slug
  return <div>My Post: {slug}</div>
}

由于 params 属性是一个 promise,你必须使用 async/await 或 React 的 use 函数来访问其值。

在版本 14 及更早版本中,params 是一个同步属性。为了向后兼容,在 Next.js 15 中你仍然可以同步访问它,但这个行为将在未来被废弃

(2) 捕获所有段
动态段可以通过在方括号中添加省略号来扩展为捕获所有后续段:[…folderName]

例如,app/shop/[…slug]/page.js 将匹配 /shop/clothes,同时也会匹配 /shop/clothes/tops、/shop/clothes/tops/t-shirts 等。

(3) 可选的捕获所有段

可以通过将参数包含在双方括号中来将捕获所有段设为可选:[[…folderName]]。
例如,app/shop/[[…slug]]/page.js 除了匹配 /shop/clothes、/shop/clothes/tops、/shop/clothes/tops/t-shirts 外,还会匹配 /shop。

捕获所有和可选捕获所有段的区别在于,可选模式下也会匹配不带参数的路由(上例中的 /shop)

并行路由

并行路由允许你在同一个布局中同时或有条件地渲染一个或多个页面。它们对于应用程序中高度动态的部分非常有用,比如仪表板和社交网站上的信息流。

例如,考虑一个仪表板,你可以使用并行路由同时渲染 team 和 analytics 页面:
在这里插入图片描述
并行路由是通过命名插槽创建的。插槽使用 @folder 约定来定义。

插槽是用于在布局中定义可插入内容的占位符,可以使用插槽来指定不同的内容区域。这些区域可以根据不同的子路由动态填充。

例如,以下文件结构定义了两个插槽:@analytics 和 @team:
在这里插入图片描述
插槽作为 props 传递给共享的父级布局。对于上面的示例,app/layout.js 中的组件现在接收 @analytics 和 @team 插槽 props,并可以与 children prop 一起并行渲染

export default function Layout({
  children,
  team,
  analytics,
}: {
  children: React.ReactNode
  analytics: React.ReactNode
  team: React.ReactNode
}) {
  return (
    <>
      {children}
      {team}
      {analytics}
    </>
  )
}

这个功能使用传统的组件导入也能实现,虽然并行路由在初看上去可能显得复杂,但它实际上为开发者提供了更高的灵活性和可维护性。

传统组件导入:

  • 通过手动导入和组合组件来构建页面。
  • 可能需要复杂的状态管理和条件渲染逻辑。
  • 难以处理多个子路由的嵌套和状态同步。

并行路由:

  • 简化了页面结构,使得不同部分的路由可以独立管理。
  • 允许不同的子路由同时存在,并且各自的状态和生命周期可以独立处理。
  • 更易于维护和扩展,特别是在大型应用中。

插槽分为静态插槽和动态插槽

  • 静态插槽:在路由中定义的插槽,其内容在构建时是固定的,不会根据 URL 或其他因素动态变化。
    app/
    ├── dashboard/
    │   ├── @team/
    │   │   ├── page.js
    │   │   └── default.js
    
    
    假设您有一个静态插槽 @team,访问 /dashboard/@team 时,会渲染 page.js 或 default.js,内容在构建时已经确定。
  • 动态插槽:在路由中定义的插槽,其内容可以根据 URL 参数或其他动态数据进行变化。
/app
  └── dashboard
      └── @team
          ├── default.js
          └── [id]
              └── page.js


当用户访问特定 URL 时,Next.js 会检查与该 URL 匹配的路由,并确定哪些插槽应该被渲染。如果某个插槽的内容与当前 URL 匹配,它将被标记为活动状态,进行渲染;如果不匹配,则视为不活动。

对于不匹配的插槽,Next.js 需要决定如何处理:如果该插槽有 default.js 文件,Next.js 将渲染该文件的内容。 如果没有 default.js 文件,Next.js 将返回一个 404 页面,表示该内容不存在。

如下面的例子,当用户访问/dashboard/123时,页面会渲染/dashboard/[id]/page.tsx, 并行路由/dashboard/@analytics/[id]/page.tsx ,/dashboard/@team/default.tsx ,因为Next.js没有找到匹配的/dashboard/@team/[id]/page.tsx ,所以渲染的事@team下的default文件,
在这里插入图片描述
如果@team连default文件都没有,页面会呈现404。

插槽不是路由段,也不会影响 URL 结构,在同一路由段级别上,你不能同时拥有静态和动态插槽。如果一个插槽是动态的,那么该级别的所有插槽都必须是动态的。

并行路由可以独立流式传输,允许你为每个路由定义独立的错误和加载状态
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑还原重置Windows系统不同操作模式

电脑有问题,遇事不决就重启,一切都不是问题!是真的这样吗。其实不然,主机系统重启确实可以自动修复一些文件错误,或者是设置问题,但是,当你由于安装了错误的驱动或者中毒严重,亦或是蓝屏,那么重启这个方子可能就治不了你的电脑了。 那么,除了当主机出现异常故障现象…

基于Java Springboot蛋糕订购小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 微信…

git 上传代码时报错

在上传代码时&#xff0c;显示无法上传 PS E:\JavaWeb\vue3-project> git push To https://gitee.com/evening-breeze-2003/vue3.git! [rejected] master -> master (non-fast-forward) error: failed to push some refs to https://gitee.com/evening-breeze-20…

【学习笔记】GoFrame框架

文章目录 什么是GoFrame框架 and 安装项目初始化 什么是GoFrame框架 and 安装 我也是用过许多框架的程序员了&#xff0c;但是GoFrame框架确实是没听说过&#xff0c;今天就来学习一下。 首先是我们熟悉的选手自我介绍环节 GoFrame 是一款模块化、高性能、企业级的 Go 语言基…

探索温度计的数字化设计:一个可视化温度数据的Web图表案例

随着科技的发展&#xff0c;数据可视化在各个领域中的应用越来越广泛。在温度监控和展示方面&#xff0c;传统的温度计已逐渐被数字化温度计所取代。本文将介绍一个使用Echarts库创建的温度计Web图表&#xff0c;该图表通过动态数据可视化展示了温度值&#xff0c;并通过渐变色…

Linq(C#)之对数据分组

分组是指将数据分到不同的组&#xff0c;使每组中的元素拥有公共的属性。 下图演示了对字符序列进行分组的结果。 每个组的键是字符。 1、group by List<int> numbers [35, 44, 200, 84, 3987, 4, 199, 329, 446, 208];IEnumerable<IGrouping<int, int>> q…

【字体】Fire Code连字效果开启

Vscode 开启方法 1、设置字体Fire Code 放在最前面的即可&#xff1a; 2、启用连字 继续往下找到“在 settings.json 中编辑”&#xff0c;然后设置"editor.fontLigatures": true &#xff1a; 保存即可。 Sublime 开启方法 设置中设置字体后&#xff0c;启…

区块链学习笔记(2)--区块链的交易模型part1

模型基础 区块链的tx分为两种模型&#xff0c;分别是比特币为代表的UTXO&#xff08;Unspent Transaction Output&#xff09;模型&#xff0c;和以太坊为代表的Account模型。前者适用于货币记账&#xff0c;后者适用于链上应用。 UTXO模型 类似于现金的交易模型 一个tx包含…

ComfyUI节点安装笔记

AI高速发展&#xff0c;版本更新相当快&#xff08;11月25日才安装的版本v.0.3.4&#xff0c;27日版本就已经更新到v.0.3.5了&#xff0c;当然不是说所有的版本更新都需要全部全新安装&#xff09;&#xff0c;在遇到问题&#xff0c;而不能通过update来更新各个节点解决时&…

数据库期末复习题库

1. Mysql日志功能有哪些? 记录日常操作和错误信息&#xff0c;以便了解Mysql数据库的运行情况&#xff0c;日常操作&#xff0c;错误信息和进行相关的优化。 2. 数据库有哪些备份方法 完全备份&#xff1a;全部都备份一遍表备份&#xff1a;只提取数据库中的数据&#xff0…

【经典论文阅读】Transformer(多头注意力 编码器-解码器)

Transformer attention is all you need 摘要 完全舍弃循环 recurrence 和卷积 convolutions 只依赖于attention mechanisms 【1】Introduction 完全通过注意力机制&#xff0c;draw global dependencies between input and output 【2】Background 1&#xff1a;self-…

理解字母形状,从而获得含义

英文字母&#xff0c;都是象形符号&#xff0c;所以&#xff0c;理解其形象&#xff0c;所象之形&#xff0c;是一项重要的工作&#xff0c;和非常有意义事情。也是我们快速记住大量单词&#xff0c;将单词从底层逻辑开始理清&#xff0c;融会贯通扩展记忆容量的重要办法之一。…

CA系统(file.h---申请认证的处理)

#pragma once #ifndef FILEMANAGER_H #define FILEMANAGER_H #include <string> namespace F_ile {// 读取文件&#xff0c;返回文件内容bool readFilename(const std::string& filePath);bool readFilePubilcpath(const std::string& filePath);bool getNameFro…

Linux Shell 脚本题目集(2)

1、使用 case 语句根据用户输入的分数&#xff08;0-100&#xff09;输出相应的成绩等级&#xff08;A, B, C, D&#xff09;。 #! /bin/bashread -p "请输入您的分数&#xff08;0-100&#xff09;&#xff1a;" score# 验证输入是否为数字且在0到100之间 if ! [[ …

混淆零碎知识点

minifyEnabled true //混淆开关 zipAlignEnabled true // Zipalign优化 shrinkResources true // 移除无用的resource文件 &#xff08;必须要混淆开了之后才才可以设置为true&#xff09; proguard-rules.pro 为混淆文件 //整个文件保留 不被混淆 -keep class com.cn…

【Vue3】从零开始创建一个VUE项目

【Vue3】从零开始创建一个VUE项目 手动创建VUE项目附录 package.json文件报错处理: Failed to get response from https://registry.npmjs.org/vue-cli-version-marker 相关链接&#xff1a; 【VUE3】【Naive UI】&#xff1c;NCard&#xff1e; 标签 【VUE3】【Naive UI】&…

常见靶场的搭建

漏洞靶场 渗透测试&#xff08;漏洞挖掘&#xff09;切忌纸上谈兵&#xff0c;学习渗透测试&#xff08;漏洞挖掘&#xff09;知识的过程中&#xff0c;我们通常需要一个包含漏洞的测试环境来进行训练。而在非授权情况下&#xff0c;对于网站进行渗透测试攻击&#xff0c;是触及…

若依项目源码阅读

源码阅读 前端代码分析 代码生成器生成的前端代码有两个&#xff0c;分别是course.js用于向后端发送ajax请求的接口代码&#xff0c;另一个是index.vue&#xff0c;用于在浏览器展示课程管理的视图组件。前端的代码是基于vue3elementplus。 template用于展示前端组件别的标签…

【算法】时间复杂度空间复杂度

0.前言 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏&#xff0c;一般是从时间和空间两个维度来衡量的&#xff0c;即时间复杂度和空间复杂度。时间复杂度主要衡量一个算法的运行快慢&#xff0c;而空间复杂度主要衡…

java全栈day10--后端Web基础(基础知识)

引言&#xff1a;只要能通过浏览器访问的网站全是B/S架构&#xff0c;其中最常用的服务器就是Tomcat 在浏览器与服务器交互的时候采用的协议是HTTP协议 一、Tomcat服务器 1.1介绍 官网地址&#xff1a;Apache Tomcat - Welcome! 1.2基本使用(网上有安装教程&#xff0c;建议…