从零掌握 Next.js App Router:打造现代化 React 应用的终极指南

270 阅读2分钟

Next.js App Router 学习指南

1. 核心概念

  • 路由文件结构

  • app/ 文件夹:所有路由从 app/ 开始。

  • 文件名作用:

  • page.js:定义页面内容(必须)。

  • layout.js:定义共享布局。

  • loading.js:定义加载状态。

  • error.js:定义错误边界。

  • not-found.js:定义 404 页面。

  • 嵌套路由:通过文件夹层级实现嵌套路由。

  • 动态路由

  • 动态路由通过 [param] 定义。

  • 示例:app/blog/[id]/page.js 对应 /blog/:id

  • 布局组件

  • layout.js:定义共享布局,减少重复代码。

  • 示例:


export default function RootLayout({ children }) {

return (

<html lang="en">

<body>

<header>My Header</header>

{children}

<footer>My Footer</footer>

</body>

</html>

);

}

  • 数据获取

  • Server Components:默认使用,支持直接调用异步函数。

  • 客户端组件:使用 "use client" 指定。

2. 创建简单项目

  • 初始化项目

  • 命令:


npx create-next-app@latest my-next-app

cd my-next-app

npm run dev

  • 添加第一个页面

  • 文件路径:app/page.js

  • 示例:


export default function HomePage() {

return <h1>Welcome to the Home Page</h1>;

}

3. 路由基本用法

  • 静态路由

  • 创建页面 /about


mkdir app/about

touch app/about/page.js

  • 示例:

export default function AboutPage() {

return <h1>About Us</h1>;

}

  • 动态路由

  • 创建动态路由 /blog/:id


mkdir -p app/blog/[id]

touch app/blog/[id]/page.js

  • 示例:

export default function BlogPost({ params }) {

return <h1>Blog Post ID: {params.id}</h1>;

}

4. 使用布局组件

  • 根布局

  • 文件路径:app/layout.js

  • 示例:


export default function RootLayout({ children }) {

return (

<html lang="en">

<body>

<header style={{ background: '#f0f0f0', padding: '1rem' }}>

<h1>My Website</h1>

</header>

<main>{children}</main>

<footer style={{ background: '#f0f0f0', padding: '1rem' }}>

<p>© 2023 My Website</p>

</footer>

</body>

</html>

);

}

  • 嵌套布局

  • 文件路径:app/dashboard/layout.js

  • 示例:


export default function DashboardLayout({ children }) {

return (

<div>

<h2>Dashboard Layout</h2>

{children}

</div>

);

}

5. 数据获取

  • Server Components

  • 示例:


async function getProducts() {

const res = await fetch('https://api.example.com/products');

return res.json();

}

export default async function ProductsPage() {

const products = await getProducts();

return (

<ul>

{products.map((product) => (

<li key={product.id}>{product.name}</li>

))}

</ul>

);

}

  • 客户端组件

  • 示例:


"use client";

import { useState } from 'react';

export default function CounterPage() {

const [count, setCount] = useState(0);

return (

<div>

<p>Count: {count}</p>

<button onClick={() => setCount(count + 1)}>Increment</button>

</div>

);

}

6. 高级功能

  • 加载状态

  • 文件路径:app/products/loading.js

  • 示例:


export default function Loading() {

return <p>Loading products...</p>;

}

  • 错误边界

  • 文件路径:app/products/error.js

  • 示例:


"use client";

export default function Error({ error, reset }) {

return (

<div>

<p>Something went wrong: {error.message}</p>

<button onClick={() => reset()}>Try again</button>

</div>

);

}

7. 推荐学习资源

  • 官方文档:Next.js App Router

  • 示例项目:Next.js Examples

  • 教程视频:YouTube 上的相关教程

总结

  • 逐步掌握 App Router 的核心功能,包括路由、布局、数据获取和高级特性。

  • 从简单项目开始,逐步尝试更复杂的场景。