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

Next.js第三章(App Router)

Next.js 路由概览

Next.js 使用基于文件系统的路由,这意味着文件和文件夹的结构直接决定了应用的路由结构。

基于文件系统的路由

我们只需要创建对应的文件和文件夹,Next.js 会自动生成对应的路由。

在 Next.js 中,每个文件夹代表一个路由段,映射到 URL 段:

page

app/
├── page.tsx               # /
├── about/
│   └── page.tsx           # /about
├── blog/test
│        └── page.tsx      # /blog/test
└── contact/└── page.tsx           # /contact

layout && template

layout(布局) 布局是多个页面共享UI,例如导航栏、侧边栏、底部等。

template(模板) 基本功能跟布局一样,只是不会保存状态

布局和模板的特点就是:

  • 多个布局可以嵌套
  • 布局会保存状态 / 模板不会保存状态
  • 根布局(必须存在)
  • 如果布局和模板同时存在,则布局会优先于模板 layout->template-page

目录结构如下:

app
└─ blog├─ layout.tsx├─ template.tsx├─ a│  └─ page.tsx└─ b└─ page.tsx

app/blog/layout.tsx

'use client' //需要交互的地方要改为客户端组件 默认是服务端组件
import { useState } from "react"
export default function BlogLayout({ children }: { children: React.ReactNode }) {const [count, setCount] = useState(0)return (<div><h1>Blog 布局组件</h1><button onClick={() => setCount(count + 1)}>+1</button><h1>数量: {count}</h1><hr />{children}</div>)
}

app/blog/template.tsx

'use client' //需要交互的地方要改为客户端组件 默认是服务端组件
import { useState } from "react"
export default function BlogTemplate({ children }: { children: React.ReactNode }) {const [count, setCount] = useState(0)return (<div><h1>Blog Template</h1><button onClick={() => setCount(count + 1)}>+1</button><h1>数量: {count}</h1><hr />{children}</div>)
}

app/blog/a/page.tsx

import Link from "next/link"
export default function APage() {return (<div><h1>A Page</h1><Link href="/blog/b">跳转B</Link></div>)
}

app/blog/b/page.tsx

import Link from "next/link"
export default function BPage() {return (<div><h1>B Page</h1><Link href="/blog/a">跳转A</Link></div>)
}

在这里插入图片描述

loading(加载)

Next.js的loading是借助了Suspense实现的,Suspense的具体用法请参考Suspense 组件

app/blog/loading.tsx

export default function Loading() {return (<div><h1>Loading...</h1></div>)
}

app/blog/a/page.tsx

import Link from "next/link"
const getData = async () => {//触发异步会自动跳转到loading组件 异步结束正常返回页面return new Promise((resolve) => {setTimeout(() => {resolve("数据")}, 5000)})
}
export default async function APage() {const data = await getData()console.log(data)return (<div><h1>A Page</h1><Link href="/blog/b">跳转B</Link></div>)
}

在这里插入图片描述

error(错误)

Next.js的error是借助了Error Boundary实现的。

app/blog/error.tsx

'use client' //错误组件必须是客户端组件
export default function Error() {return (<div><h1>Error</h1></div>)
}

app/blog/a/page.tsx

import Link from "next/link"
export default async function APage() {//遇到异常会自动跳转到error组件throw new Error("错误")return (<div><h1>A Page</h1><Link href="/blog/b">跳转B</Link></div>)
}

在这里插入图片描述

not-found(404)

其实Next.js 默认会生成一个404页面,但我们可能自定义404页面,只需要在app目录下创建一个not-found.tsx文件即可

app/not-found.tsx

export default function NotFound() {return (<div><h1>404 Page</h1></div>)
}

在这里插入图片描述

预计学习时间: 20 分钟
难度级别: 初级 🟢

http://www.dtcms.com/a/597055.html

相关文章:

  • 长芯微LPS1032完全P2P替代LM3880,LPS1032系列产品是简单的电源序列器,提供多通道电源的加电和断电顺序控制。
  • 百度提交网站收录建筑网址大全
  • TensorFlow深度学习实战——胶囊网络
  • [Linux]学习笔记系列 -- [kernel]kallsyms
  • 手机代理企业网站wordpress农业站模板
  • 门户网站开发的意义ppt 做的最好的网站有哪些
  • 龙岗AI搜索优化亲测效果分享
  • 【多源 BFS】1. 01 矩阵(medium)
  • 物联网工控一体机操作系统选型:安卓、Ubuntu、Debian 场景化决策指南
  • 【代码审计】RuoYi-4.2 五处安全问题分析
  • 如何制作自己的网站并且插口代码wordpress .htaccess 伪静态
  • 【openGauss】谈一谈openGauss对Oracle中lob类型的兼容情况
  • 【自然语言处理】WordNet与知网:支撑自然语言理解的词汇知识库双璧
  • 怎么自己弄一个网站编程课程收费标准
  • Vue 项目实战《尚医通》,登录组件获取验证码,笔记25
  • 【无标题】六边形拓扑量子计算:NP完全问题的统一解决框架
  • IDEA下载
  • 网站自己做需要多少钱中国住建部和城乡建设部
  • 电磁波传播理论的数学描述和python模拟
  • 符合网络营销网站建设郑州威盟网站建设公司怎么样
  • 金阊企业建设网站公司wordpress教程cms
  • 李沐深度学习笔记D3-基础的优化方法
  • 【MCP:七千字图文详解】从灵感闪现到生态确立,全链路解读与实战
  • GitHub 热榜项目 - 日榜(2025-11-11)
  • OpenCV图像亮度与对比度调整
  • 应急响应基础
  • jsp技术做网站有什么特点免费软件下载网站入口正能量
  • WSL2下Ubuntu20.04图形化环境配置
  • Ubuntu单用户
  • h5制作网站哪个好杭州做网站的公司