Chuyển đến nội dung chính

NextJs: App Router - Part 2

Routing, hay định tuyến, là quá trình quyết định cách ứng dụng phản hồi yêu cầu của người dùng đến một URL cụ thể. Khi người dùng nhấp vào liên kết, nhập URL vào trình duyệt hoặc thực hiện hành động thay đổi URL hiện tại, cơ chế routing sẽ quyết định nội dung hoặc component nào sẽ hiển thị trên trang.

Tại sao lại cần App Router?

Trong khi Pages Router, với cấu trúc thư mục pages quen thuộc, đã phục vụ tốt cho việc routing trong các phiên bản trước của Next.js, App Router ra đời như một giải pháp cho những đòi hỏi ngày càng cao của ứng dụng web hiện đại.

Thay vì pages, App Router sử dụng thư mục app để định nghĩa các route và layout.

File layout.js/tsx

Là component bao bọc bên ngoài component page.js/tsx, định nghĩa layout chung cho một nhóm route con.

Hỗ trợ khai báo metadata cho từng route con.

Giúp tái sử dụng layout và logic chung cho nhiều route.

File page.js/tsx

Đại diện cho một route cụ thể, là component chính được hiển thị cho route tương ứng.

app/not-found.js/tsx 

Xử lý trường hợp không tìm thấy route (404 Not Found).

app/error.js/tsx

Xử lý lỗi xảy ra trong quá trình render.

app/loading.js/tsx

Hiển thị component loading trong quá trình chuyển trang, khi nội dung đang được tải từ server.

Ví dụ

Dưới đây là example tạo App Router trong NextJs 14

Dựa vào ví dụ bài trước, bạn mở file layout.tsx và thêm danh sách hyperlink như sau:

//..
import Link from 'next/link';

//....
export default function RootLayout({
  children,
}: Readonly<{
  children: React.ReactNode;
}>) {
  return (
    <html lang="en">
      <body className={inter.className}>
        <ul>
          <li><Link href={'/'}>Home Page</Link></li>
          <li><Link href={'/about'}>About us</Link></li>
          <li><Link href={'/this-page-not-exist'}>This page Does not exist</Link></li>
        </ul>
        {children}
        <BootstrapClient />
      </body>
    </html>
  );
}
Đoạn code trên dùng để hiển thị navigation bar cho tất cả các component.

Tạo file Create not-found.tsx. Trang này sẽ hiển thị nếu bạn cố mở 1 route mà chưa định nghĩa trong web application

//File path: src/app/not-found.tsx
export default function Page() {
	return (
		<>
			<hr /><h1>404 Page not found</h1><hr />
		</>
	)
}
Tạo trang About page: src/app/about/page.tsx
export default function AboutUs(){
    return (
        <main>
            <h1>About us</h1>
            <ul className="list-group">
            <li className="list-group-item">An item</li>
            <li className="list-group-item">A second item</li>
            <li className="list-group-item">A third item</li>
            <li className="list-group-item">A fourth item</li>
            <li className="list-group-item">And a fifth one</li>
            </ul>
        </main>
    );
}
Tạo file layout.tsx
export default function AboutLayout({ children }: { children: React.ReactNode }) {
    return (
      <div style={{ border: "2px solid blue", padding: "1rem" }}>
        <h2>About Layout</h2>
        {children}
      </div>
    );
  }
Run app bằng command để xem kết quả
npm run dev

Dynamic route

Dynamic Route cho phép bạn tạo ra các route linh hoạt, có thể thay đổi dựa trên một phần tử nào đó trong URL. Ví dụ, thay vì tạo route riêng cho mỗi bài viết trên blog (/posts/post-1, /posts/post-2, ...), bạn có thể dùng dynamic route để xử lý tất cả bài viết với chỉ một route (/posts/[slug]).

Slug là gì?

Slug is an unique part of an URL that provides information about a web page. You should keep them simple, human-readable to help out with SEO. It appears at the end part of the URL after the backslash (“/”). For example, how-to-learn is the slug of the URL https://tapascript.io/blog/how-to-learn.

Slug là phần tử động trong URL, thường được sử dụng để đại diện cho tiêu đề bài viết hoặc tên sản phẩm theo cách thân thiện với SEO. Slug thường được viết thường, không dấu và ngăn cách bởi dấu gạch ngang (-).

📁 app/
    └──📂 blog/
        ├──{slug} /blog/how-to-sleep-well
        ├──..
    └──📂 about/
        ├── about-us /about/about-us
        ├── form /about/form

Dưới đây là ví dụ tạo page blog nhận params từ dynamic routes

type BlogPostProps = {
	params: {
	  slug: string;
	};
};

const BlogPost: React.FC<BlogPostProps> = ({ params: { slug } }) => {
	return (
	  <p className="text-2xl">
		Showing the blog post for the slug <strong>{slug}</strong>
	  </p>
	);
};

export default BlogPost;


Tham khảo

Dynamic routes recipes from Next.js App Router

React: React Router - Day 14

Nhận xét

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.