Làm việc với App Router (Next.js 13+)

Tạo bởi Hoàng Vũ, chỉnh sửa cuối lúc 11 tháng 4, 2025

Từ phiên bản Next.js 13, App Router được giới thiệu như một cách tiếp cận mới để xây dựng ứng dụng React theo hướng module hóa, dễ mở rộng và logic hơn. Bài học này sẽ giúp bạn hiểu:

  • App Router là gì và tại sao nó thay thế Pages Router truyền thống
  • Cách tổ chức thư mục app/ và vai trò của từng file như layout.tsx, page.tsx, loading.tsx, error.tsx
  • Cách tạo routing động và nested layout một cách mạch lạc, rõ ràng

Làm việc với App Router (Next.js 13+)

1. App Router là gì?

  • App Router là hệ thống routing mới của Next.js 13+, hoạt động dựa trên thư mục app/ thay vì pages/.
  • Nó hỗ trợ tốt hơn cho:
    • Nested routing
    • Layout dùng chung
    • Loading, error UI riêng biệt
    • Server Components (bên cạnh Client Components)

So sánh nhanh:

Pages Router (pages/) App Router (app/)
File-based routing Folder-based routing
Không có layout lồng Hỗ trợ nested layouts
SSR/SSG qua hàm Dùng async Server Component
Không phân biệt Client/Server Component rõ ràng Có (server mặc định)

2. Cấu trúc thư mục app/ cơ bản

app/
├── layout.tsx        // Layout bao ngoài tất cả routes
├── page.tsx          // Trang chính (giống như index.js)
├── loading.tsx       // UI khi loading
├── error.tsx         // UI khi có lỗi
├── about/
│   └── page.tsx      // Route /about
└── dashboard/
    ├── layout.tsx    // Layout riêng cho dashboard
    ├── page.tsx      // Route /dashboard
    └── settings/
        └── page.tsx  // Route /dashboard/settings

layout.tsx: có thể khai báo nhiều cấp, bao layout cho child route bên trong.

3. Tạo route động trong App Router

  • Cú pháp giống Pages Router nhưng áp dụng trong thư mục app/
    Ví dụ:
app/
└── blog/
    └── [slug]/
        └── page.tsx
  • Trong file page.tsx, bạn truy cập biến động qua params:
export default function BlogPost({ params }: { params: { slug: string } }) {
  return <h1>Bài viết: {params.slug}</h1>;
}

4. Nested layout & composition

  • Có thể tạo layout cho từng nhóm route:
app/
└── dashboard/
    ├── layout.tsx      // Layout riêng cho dashboard
    ├── page.tsx        // Trang /dashboard
    └── analytics/
        └── page.tsx    // Trang /dashboard/analytics
  • layout.tsx sẽ tự động wrap tất cả các child route trong nhánh đó.

Ví dụ:

// dashboard/layout.tsx
export default function DashboardLayout({ children }: { children: React.ReactNode }) {
  return (
    <div>
      <Sidebar />
      <main>{children}</main>
    </div>
  );
}

Layout có thể lồng nhiều cấp, rất phù hợp cho các hệ thống có nhiều màn hình con như dashboard, CMS, v.v.

Kết luận

App Router là bước tiến mạnh mẽ của Next.js trong việc hiện đại hóa cấu trúc ứng dụng React. Bằng cách sử dụng layout lồng, routing rõ ràng, UI riêng cho loading & error, bạn sẽ có một ứng dụng dễ quản lý, mở rộng và chuyên nghiệp hơn rất nhiều so với cách cũ.

Website Logo

Với hơn 10 năm kinh nghiệm lập trình web và từng làm việc với nhiều framework, ngôn ngữ như PHP, JavaScript, React, jQuery, CSS, HTML, CakePHP, Laravel..., tôi hy vọng những kiến thức được chia sẻ tại đây sẽ hữu ích và thiết thực cho các bạn.

Bình luận

Website Logo

Chào, tôi là Vũ. Đây là blog hướng dẫn lập trình của tôi.

Liên hệ công việc qua email dưới đây.

lhvuctu@gmail.com

Chúng Tôi Trên

Bạn đang muốn học về lập trình website?

Bạn cần nâng cao kiến thức chuyên nghiệp hơn để nâng cao cơ hội nghề nghiệp? Liên hệ