Thành phần bất đồng bộ
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 23 trên 47.
Đây là thành quả từ những gì chương trước đã chuẩn bị. Một thành phần máy chủ có thể là async:
import { getDishes } from '../lib/data';
export default async function Page() {
const dishes = await getDishes();
return <h1>{dishes.length} dishes</h1>;
}Hãy đọc lại điều đó, vì đây thực sự là điều mới mẻ. Thành phần chờ. Next.js chạy thành phần này trên máy chủ, để await hoàn tất, rồi mới chuyển kết quả thành HTML.
Hãy so sánh với phiên bản chỉ chạy trên trình duyệt mà nếu không thì bạn sẽ viết:
- Trang tải trống trước
- Một yêu cầu được gửi đi sau khi trang đã tải xong
- Một trạng thái thay đổi và nội dung xuất hiện, tạo ra hiện tượng nhấp nháy mà người dùng thấy mỗi lần
Với một thành phần máy chủ bất đồng bộ, không có lần hiển thị rỗng ban đầu. Không có gì để chuyển sang, vì dữ liệu đã có sẵn khi HTML được tạo. Không có useEffect, không có cờ tải, không có yêu cầu thứ hai.
Hai quy tắc giúp cách này hợp lệ:
- Chỉ các component server mới có thể dùng
async: component có đánh dấu'use client'thì không thể - Dữ liệu phải đến từ nơi máy chủ có thể truy cập: cơ sở dữ liệu, tệp hoặc module như
lib/data.js
Thử thách
Dễlib/data.js đã được cung cấp và khóa. Tệp này xuất getDishes(), hàm này trả về một promise chứa mảng các đối tượng { id, name }.
- Biến
Pagetrongapp/page.jsxthành một hàmasync. - Dùng
await getDishes()để lấy dữ liệu vào biếndishes. - Bên trong
<ul id="dish-list">, hiển thị một<li>cho mỗi món ăn, vớikey={dish.id},id={dish.id}vànamecủa món ăn làm nội dung.
Không dùng useEffect, không cần cờ tải, chỉ cần await.
Tự làm thử
import './globals.css';
export const metadata = {
title: 'My App',
};
export default function RootLayout({ children }) {
return (
<html lang="en">
<body>
{children}
</body>
</html>
);
}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
4Máy chủ và client
Hai loại thành phầnĐọc lỗiDòng 'use client'Giữ phần client nhỏ gọnMáy chủ bên trong clientTóm tắt: máy chủ và client7Điều hướng phía máy khách
Liên kết đang hoạt độngĐiều hướng bằng codeLọc bằng URLBộ xử lý tuyến đườngÔn tập: Điều hướng2Định tuyến và liên kết
Thư mục tạo thành tuyến đườngTuyến đường lồng nhauLiên kết các trangTuyến đường độngTrang không tìm thấyÔn tập: định tuyến5Dữ liệu trên máy chủ
Thành phần bất đồng bộChờ tham số của tuyếnHai lần gọi dữ liệu cùng lúcTrạng thái tảiXử lý lỗiÔn tập: Lấy dữ liệu