从0死磕全栈之Next.js App Router 入门实战:5 分钟搭建一个待办事项(Todo List)应用

想快速上手 Next.js 新一代路由系统?本文用一个超简单的 待办事项(Todo List) 例子,带你零压力掌握 App Router 的核心用法:页面、布局、动态交互、客户端/服务端组件区分。代码可直接运行,新手友好!


二、准备工作

确保已安装 Node.js(22+),然后创建项目:

bash 复制代码
npx create-next-app@latest todo-app-router

安装过程中:

  • Would you like to use TypeScript? → No(本文用 JavaScript)
  • Would you like to use ESLint? → Yes(可选)
  • Would you like to use Tailwind CSS? → No(简化样式)
  • Would you like to use src/ directory? → No
  • Would you like to use App Router?Yes ✅(关键!)

项目创建后,你会看到 app/ 目录------这就是 App Router 的起点!


三、第一步:创建首页(显示待办列表)

编辑文件:app/page.js

jsx 复制代码
// app/page.js
export default function HomePage() {
  // 模拟待办数据(真实项目可从数据库或 API 获取)
  const todos = [
    { id: 1, text: '学习 Next.js App Router', completed: false },
    { id: 2, text: '写一篇技术博客', completed: true },
    { id: 3, text: '喝杯咖啡休息一下', completed: false },
  ];

  return (
    <div style={{ padding: '2rem', fontFamily: 'sans-serif' }}>
      <h1>✅ 我的待办事项</h1>
      <ul style={{ listStyle: 'none', padding: 0 }}>
        {todos.map(todo => (
          <li 
            key={todo.id}
            style={{
              padding: '0.5rem',
              margin: '0.5rem 0',
              backgroundColor: todo.completed ? '#e6ffe6' : '#fff0f0',
              textDecoration: todo.completed ? 'line-through' : 'none'
            }}
          >
            {todo.text}
          </li>
        ))}
      </ul>
    </div>
  );
}

🔍 注意:这个页面没有用 'use client' ,所以它是 服务端组件(Server Component) ------页面在服务端渲染,HTML 直接包含列表内容,加载快、SEO 好!

运行项目:

bash 复制代码
npm run dev

访问 http://localhost:3000,就能看到待办列表了!


四、第二步:添加交互功能

现在我们想点击待办项,切换"完成/未完成"状态。

但!服务端组件不能用 useState 或 onClick。怎么办?

👉 解决方案:把需要交互的部分拆成客户端组件

1. 创建客户端组件:app/TodoItem.js

jsx 复制代码
// app/TodoItem.js
'use client'; // 告诉 Next.js:这是客户端组件!

import { useState } from 'react';

export default function TodoItem({ text, initialCompleted }) {
  const [completed, setCompleted] = useState(initialCompleted);

  const toggle = () => {
    setCompleted(!completed);
  };

  return (
    <li 
      onClick={toggle}
      style={{
        padding: '0.5rem',
        margin: '0.5rem 0',
        backgroundColor: completed ? '#e6ffe6' : '#fff0f0',
        textDecoration: completed ? 'line-through' : 'none',
        cursor: 'pointer'
      }}
    >
      {text} {completed ? '✅' : '⏳'}
    </li>
  );
}

2. 在首页中使用它:修改 app/page.js

jsx 复制代码
// app/page.js
import TodoItem from './TodoItem';

export default function HomePage() {
  const todos = [
    { id: 1, text: '学习 Next.js App Router', completed: false },
    { id: 2, text: '写一篇技术博客', completed: true },
    { id: 3, text: '喝杯咖啡休息一下', completed: false },
  ];

  return (
    <div style={{ padding: '2rem', fontFamily: 'sans-serif' }}>
      <h1>✅ 我的待办事项</h1>
      <ul style={{ listStyle: 'none', padding: 0 }}>
        {todos.map(todo => (
          <TodoItem 
            key={todo.id} 
            text={todo.text} 
            initialCompleted={todo.completed} 
          />
        ))}
      </ul>
    </div>
  );
}

✅ 现在点击任意待办项,就能切换状态了!而且只有 TodoItem 是客户端组件,其余页面仍是服务端渲染,性能最优。


五、第三步:添加全局布局(Header)

我们希望所有页面顶部都有个标题栏。

创建 app/layout.js

jsx 复制代码
// app/layout.js
export default function RootLayout({ children }) {
  return (
    <html lang="zh">
      <body>
        <header style={{
          backgroundColor: '#000',
          color: 'white',
          padding: '1rem',
          textAlign: 'center'
        }}>
          <h1>📝 我的 Todo 应用</h1>
        </header>
        <main>{children}</main>
      </body>
    </html>
  );
}

保存后刷新页面,你会发现标题栏自动出现在首页顶部!

这就是 App Router 的 自动布局嵌套 能力。


六、App Router 核心知识点总结

概念 说明 本文例子
app/ 目录 App Router 的根目录 项目结构基础
page.js 定义一个页面 app/page.js → 首页
服务端组件 默认组件类型,不能用 useState/useEffect HomePage
'use client' 标记客户端组件,支持交互 TodoItem
layout.js 定义布局,自动包裹子页面 全局 Header
组件拆分 交互部分独立为客户端组件,其余保持服务端渲染 最佳实践 ✅

结语

通过一个简单的 Todo List,我们轻松掌握了 Next.js App Router 的核心思想:

"能服务端渲染的尽量服务端渲染,需要交互的才用客户端组件。"

这种架构让应用更快、更轻、更易维护。现在,你已经具备了用 App Router 开发真实项目的基础!

快去创建你的下一个 Next.js 应用吧 🚀


相关推荐
摸鱼的春哥5 分钟前
春哥的Agent通关秘籍07:5分钟实现文件归类助手【实战】
前端·javascript·后端
Victor35622 分钟前
MongoDB(2)MongoDB与传统关系型数据库的主要区别是什么?
后端
JaguarJack22 分钟前
PHP 应用遭遇 DDoS 攻击时会发生什么 从入门到进阶的防护指南
后端·php·服务端
BingoGo23 分钟前
PHP 应用遭遇 DDoS 攻击时会发生什么 从入门到进阶的防护指南
后端
Victor35624 分钟前
MongoDB(3)什么是文档(Document)?
后端
牛奔2 小时前
Go 如何避免频繁抢占?
开发语言·后端·golang
想用offer打牌7 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
KYGALYX9 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了9 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
爬山算法9 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate