Menu
CoddyTech

Siêu dữ liệu động

Thuộc phần Kiến thức thiết yếu về Next.js trong hành trình React của Coddy. Bài học 15 trên 47.

Đối tượng metadata là hằng số nên không thể dùng cho một tuyến động: app/dishes/[slug]/page.jsx hiển thị một món ăn khác nhau ở mỗi URL, và mỗi món cần tiêu đề riêng.

Để làm vậy, hãy xuất một hàm thay vào đó:

export async function generateMetadata({ params }) {
    const { slug } = await params;
    return { title: DISHES[slug].name };
}

Nó nhận cùng params như trang (một promise, nên bạn await nó) và trả về đối tượng có cấu trúc giống với đối tượng metadata. Hãy dùng một trong hai cách, không dùng cả hai trong cùng một tệp.

Mẫu tiêu đề

Việc lặp lại tên trang web trong tiêu đề của mọi trang sẽ nhanh chóng trở nên nhàm chán. Thay vì một chuỗi thông thường, layout có thể truyền xuống một mẫu:

// app/layout.jsx
export const metadata = {
    title: {
        default: 'Coddy Eats',
        template: '%s | Coddy Eats',
    },
};
  • default: tiêu đề cho những trang không đặt tiêu đề
  • template: mẫu dành cho những trang có đặt tiêu đề; tiêu đề của trang sẽ được chèn vào vị trí của %s

Vì vậy, trang trả về title: 'Margherita' sẽ hiển thị Margherita | Coddy Eats trên thẻ, còn trang chủ không đặt giá trị nào sẽ giữ nguyên Coddy Eats. Hãy viết thương hiệu một lần trong bố cục.

challenge icon

Thử thách

Trung bình

Hiện tại, trang của mỗi món ăn đều hiển thị Coddy Eats trên tab. Đặt tiêu đề riêng cho từng trang.

Trong app/dishes/[slug]/page.jsx, thêm một hàm async được export tên là generateMetadata, hàm này:

  1. Nhận { params } và chờ kết quả để lấy slug
  2. Trả về { title: DISHES[slug].name }

app/layout.jsx đã có mẫu '%s | Coddy Eats', nên tiêu đề của /dishes/margherita sẽ là Margherita | Coddy Eats. Hãy xem tệp layout, bạn không cần thay đổi tệp này.

Tự làm thử

import './globals.css';

export const metadata = {
    title: {
        default: 'Coddy Eats',
        template: '%s | Coddy Eats',
    },
};

export default function RootLayout({ children }) {
    return (
        <html lang="en">
            <body>
                {children}
            </body>
        </html>
    );
}
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Kiến thức thiết yếu về Next.js