Làm mới trang
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 32 trên 47.
Suốt hai bài học, bạn vẫn tin vào một điều không đúng. Bạn gửi biểu mẫu và mục đó thực sự được lưu, nhưng màn hình không chuyển sang trang khác. Tải lại trang, mục đó sẽ hiện ra.
Chính điều này giúp Server Components chạy nhanh. Trang đọc dữ liệu một lần trên máy chủ, còn trình duyệt giữ kết quả hoàn chỉnh. Hành động của bạn đã thay đổi dữ liệu phía sau trang. Không ai báo cho trang biết.
Bản sửa chỉ cần một dòng ở cuối hành động:
'use server';
import { revalidatePath } from 'next/cache';
import { saveTask } from '../lib/db';
export async function addTask(formData) {
saveTask(formData.get('title'));
revalidatePath('/');
}revalidatePath('/') xóa dữ liệu Next.js đã lưu vào bộ nhớ đệm cho đường dẫn đó rồi kết xuất lại (trên máy chủ, với dữ liệu mới), sau đó thay kết quả mới vào trang. Không tải lại trang, không có vòng quay tải, không có trạng thái.
Đối số là đường dẫn cần kết xuất lại, được viết giống như cách nó xuất hiện trong URL: '/' cho trang chủ, '/tasks' cho trang công việc. Nếu trỏ đến sai đường dẫn thì sẽ không có gì thay đổi hiển thị: đây là bug kinh điển kiểu "hàm xử lý của mình hoạt động nhưng danh sách vẫn cũ".
Đôi khi bạn không muốn ở yên một chỗ. Với thao tác “lưu lại rồi chuyển đến nơi khác”, Server Action có thể kết thúc bằng redirect():
import { redirect } from 'next/navigation';
export async function createPost(formData) {
const id = savePost(formData.get('title'));
redirect(`/posts/${id}`);
}Cùng câu lệnh import mà bạn sẽ dùng trong một trang. Dùng revalidatePath khi người dùng vẫn ở lại trang, và redirect khi họ chuyển sang trang khác.
Thử thách
DễaddTask lưu chính xác, nhưng danh sách trên màn hình không bao giờ cập nhật. Hãy sửa lỗi này.
- Trong
app/actions.js, nhậprevalidatePathtừ'next/cache'. - Gọi hàm này với đường dẫn trang chủ,
'/', sau khi lưu tác vụ.
Bạn không cần thay đổi gì trong app/page.jsx: chỉ cần thêm một dòng nhập và sửa một dòng.
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ến3Bố cục và siêu dữ liệu
Bố cục gốcĐiều hướng dùng chungBố cục lồng nhauSiêu dữ liệu trangSiêu dữ liệu độngÔn tập: bố cục6Server Actions
Server Action là gìBiểu mẫu có thể hoạt độngĐọc dữ liệu biểu mẫuLàm mới trangÔn tập: Server Actions