•9 phút đọc

React 19: Server Actions & Cập nhật Optimistic (Không độ trễ)

React 19: Server Actions & Cập nhật Optimistic (Không độ trễ)
Kiến trúc React 19 Server Actions và Cập nhật Optimistic
Audio Briefing
0:00 / --:--

React 19 giải quyết vấn đề này một cách nguyên bản (natively). Bằng cách kết hợp Server Actions với các hook useOptimistic và useActionState, React mang lại độ trễ cảm nhận tức thì 0ms, đồng thời đảm bảo tính nhất quán tuyệt đối của trạng thái nếu một tác vụ thay đổi dữ liệu ở backend thất bại.

Trong bài phân tích chuyên sâu này, chúng ta sẽ khám phá cách React 19 điều phối các transition đồng thời, thực thi phía server, và rollback optimistic tức thì mà không cần đến các thư viện quản lý trạng thái của bên thứ ba.


Bộ ba (Triad) thay đổi trạng thái trong React 19

React 19 giới thiệu ba thành phần cơ bản chuyên biệt hoạt động cùng nhau để thay thế việc quản lý trạng thái form cồng kềnh:

Hook / PrimitiveTrách nhiệm chínhNơi chạyTính năng chính
Server Actions
Thay đổi dữ liệu phía server & ghi vào DB
Chỉ môi trường server
Cải tiến lũy tiến (Progressive enhancement), tự động serialize FormData
useActionState
Trạng thái action của form, xử lý lỗi & trạng thái chờ (pending)
Client Component
Trả về [state, formAction, isPending]
useOptimistic
Render UI tức thì với độ trễ bằng không
Client Component (bên trong Transition)
Tự động hoàn tác về trạng thái đúng của server nếu action bị từ chối (reject)

Vòng đời & Luồng Rollback của Optimistic Update

Điều gì xảy ra đằng sau hậu trường khi người dùng gửi một form trên kết nối 3G chậm hoặc gặp phải timeout từ máy chủ?


Advertisement

Kiến trúc Production hoàn chỉnh: Lượt thích & Bình luận

tsx
"use server";

import { revalidatePath } from "next/cache";

export type ActionResponse = {
  success: boolean;
  likesCount?: number;
  error?: string;
};

export async function toggleLikeAction(
  postId: string,
  currentLikes: number
): Promise<ActionResponse> {
  try {
    // Giả lập ghi vào cơ sở dữ liệu
    await new Promise((resolve) => setTimeout(resolve, 800));
    
    // Giả lập lỗi ngẫu nhiên để minh họa khả năng rollback mạnh mẽ
    if (Math.random() < 0.1) {
      throw new Error("Network timeout while updating likes table");
    }

    const updatedLikes = currentLikes + 1;
    revalidatePath(`/blog/${postId}`);
    return { success: true, likesCount: updatedLikes };
  } catch (err: any) {
    return { success: false, error: err.message || "Failed to register like" };
  }
}

Checklist 4 bước cho UI Optimistic hoàn hảo

1. Luôn bọc trong một Transition

Các giá trị từ useOptimistic chỉ giữ trạng thái tạm thời của chúng trong khi một React transition đang hoạt động. Luôn gọi action của bạn bên trong startTransition hoặc truyền trực tiếp vào <form action={...}>.

2. Tạo ID tạm thời ổn định

Khi thêm các mục vào danh sách một cách optimistic, hãy tạo một UUID tạm thời (crypto.randomUUID()) để React có thể key các mục trong danh sách một cách chính xác trước khi server tạo ra ID thực sự từ cơ sở dữ liệu.

3. Xử lý cả lỗi Rejection và lỗi từ Server

Server Actions nên trả về các đối tượng có cấu trúc như { success: false, error: "..." } thay vì để promise bị reject không được xử lý, để các component phía client có thể hiển thị thông báo thân thiện (toast) trong quá trình rollback.

4. Chỉ Revalidate những gì đã thay đổi

Sử dụng revalidatePath hoặc revalidateTag một cách chi tiết trong Next.js Server Actions để tránh làm mất hiệu lực toàn bộ cache của trang và buộc phải re-render toàn trang tốn kém.


Flashcard về Mô hình tư duy

Cốt lõi React 19

Cập nhật UI Optimistic

Click to reveal
Cốt lõi React 19
Hiển thị thay đổi trạng thái ngay lập tức trên giao diện người dùng trước khi nhận được xác nhận từ server, sau đó đồng bộ hóa hoặc rollback khi server phản hồi.

Cập nhật UI Optimistic

React Hooks

Hook useOptimistic

Click to reveal
React Hooks
Một hook trong React 19 nhận vào trạng thái cơ bản và một hàm reducer cập nhật, trả về một giá trị tạm thời sẽ tự động hoàn tác khi các transition kết thúc.

Hook useOptimistic

Kiến trúc

Cải tiến lũy tiến (Progressive Enhancement)

Click to reveal
Kiến trúc
Khả năng của các form HTML sử dụng Server Actions có thể gửi và thực thi ngay cả khi JavaScript vẫn đang tải hoặc bị tắt trên trình duyệt của client.

Cải tiến lũy tiến (Progressive Enhancement)


Kiểm tra kiến thức tương tác

Interactive Quiz

Điều gì khiến giá trị optimistic trong `useOptimistic` của React 19 hoàn tác về trạng thái ban đầu?


Các câu hỏi thường gặp

Không. useOptimistic được thiết kế đặc biệt để xử lý các tác vụ thay đổi dữ liệu đang chờ (pending mutations) trong các transition bất đồng bộ. Mặc dù nó thay thế các thư viện fetching phía client cho việc gửi form, các store toàn cục như Zustand vẫn là lựa chọn lý tưởng cho các trạng thái chỉ tồn tại ở client và cần chia sẻ giữa nhiều trang (như chuyển đổi theme sáng/tối hoặc trình phát âm thanh).

Có! Bạn có thể gọi Server Actions bên trong các trình xử lý onClick, useEffect, hoặc các custom hook bằng cách bọc lệnh gọi trong startTransition(async () => { await myAction(); }).

React 19 cung cấp trạng thái isPending thông qua useActionState và useFormStatus, cho phép bạn vô hiệu hóa các nút gửi hoặc thực hiện debounce cho các input trong khi một server action đang được xử lý.


Bài viết liên quan

Chia sẻ bài viết:

Đăng ký nhận bản tin

Nhận các bài viết công nghệ và kiến trúc hệ thống mới nhất trực tiếp qua email.

Tiện ích lập trình viên

Công cụ lập trình trực tiếp trên trình duyệt

Làm sạch log AI CLI, tạo biểu thức cron, giải mã JWT và tính quyền chmod offline.

Khám phá công cụ
Advertisement
Dev Kits & DataToolsTagsRSSPrivacy PolicyTerms