TopDev AI Robot TopDev
#Frontend & Web UI

Deep-dive React 19 Actions và useActionState: Đơn giản hóa quản lý Form không cần thư viện ngoài

Lan Anh (Senior Frontend)
📖 2 phút đọc 💬 1 phản hồi
⚡ Tóm tắt 30 giây bởi TopDev AI
AI Overview

Tạm biệt những mớ bòng bong useState trong Form Trước đây khi xử lý một Form nhập liệu đơn giản trong React, bạn thường phải tạo ít nhất 3 state: Và phải nhớ gọi e.preventDefault, bọc khối try/catch,…

☰ Mục lục bài viết (4 phần) Mở / Đóng mục lục

Tạm biệt những mớ bòng bong useState trong Form#

Trước đây khi xử lý một Form nhập liệu đơn giản trong React, bạn thường phải tạo ít nhất 3 state:

TSX
const [isLoading, setIsLoading] = useState(false);
const [error, setError] = useState(null);
const [data, setData] = useState(null);

Và phải nhớ gọi e.preventDefault(), bọc khối try/catch, và reset state thủ công mỗi lần submit.

React 19 giới thiệu khái niệm Actions cùng bộ ba hook mới: useActionState, useFormStatus, và useOptimistic.

Quản lý Form thanh lịch với useActionState#

TSX
import { useActionState } from 'react';

// Hàm action có thể chạy async, nhận state trước đó và FormData
async function updateUsernameAction(previousState: any, formData: FormData) {
  const newName = formData.get('username') as string;
  try {
    const updatedUser = await apiUpdateName(newName);
    return { success: true, user: updatedUser, error: null };
  } catch (err: any) {
    return { success: false, user: null, error: err.message };
  }
}

export function EditProfileForm() {
  const [state, formAction, isPending] = useActionState(updateUsernameAction, null);

  return (
    <form action={formAction} className="space-y-4">
      <input name="username" defaultValue="Nam Hoàng" className="border p-2 rounded" />
      
      <button type="submit" disabled={isPending} className="bg-brand-500 text-white px-4 py-2 rounded">
        {isPending ? 'Đang lưu...' : 'Cập nhật'}
      </button>

      {state?.error && <p className="text-red-500">{state.error}</p>}
      {state?.success && <p className="text-green-500">Đã cập nhật thành công!</p>}
    </form>
  );
}

3 Lợi thế đột phá của React 19 Actions#

  1. Tự động quản lý Pending State: Biến isPending tự động chuyển thành true khi action bắt đầu và chuyển về false khi hoàn tất mà không cần viết setIsLoading.
  2. Hỗ trợ Progressive Enhancement: Form có thể hoạt động ngay cả khi JavaScript chưa kịp tải xong ở trình duyệt!
  3. Reset Form tự động: Khi action thành công, React tự động dọn dẹp các trường nhập liệu nếu được cấu hình.

Góc thảo luận#

Anh em đã nâng cấp dự án lên React 19 chưa? Có anh em nào vẫn đang dùng React Hook Form hay Formik không?


Xem thêm nội dung liên quan:

Chia sẻ thảo luận này:

Thảo luận

1 phản hồi

Ý kiến từ cộng đồng kỹ sư TopDev
💬

Tham gia thảo luận

Cộng đồng mở · Đăng nhập 1-chạm qua Google
  1. Quốc Bảo (Fullstack Developer)
    #1

    Hook useActionState này kết hợp với Server Actions trong Next.js hoặc Astro SSR là sự kết hợp hoàn hảo. Khối lượng boilerplate giảm đi một nửa mà trải nghiệm gõ form rất sướng.

Bài liên quan trong #Frontend & Web UI

1
TopDev AI Companion
AI
✓ Đã sao chép link