- vừa được xem lúc

Làm chủ useActionState trong React

0 0 2

Người đăng: Vinh Phạm

Theo Viblo Asia

Nếu bạn đang tìm hiểu về React hiện đại — đặc biệt là với React Server Components — thì có một hook mạnh mẽ nhưng ít người biết đến mà bạn nên làm quen: useActionState

Hook này có mặt trong các bản build experimental và Canary của React, và nó mang lại một cách quản lý state liên quan đến form thông minh hơn, được gắn trực tiếp với quá trình gửi form.

Trong bài viết này, chúng ta sẽ phân tích useActionState là gì, lý do tại sao nó hữu ích, và đi qua các ví dụ thực tế để bạn có thể tự tin tích hợp nó vào ứng dụng của mình.

useActionState là gì?

useActionState là một hook trong React được thiết kế để xử lý việc cập nhật state xảy ra sau khi một form được gửi.

Hãy nghĩ về nó như một cách khai báo rõ ràng hơn để xử lý kết quả của một hành động — chẳng hạn như gửi dữ liệu lên server hoặc xác thực một trường thông tin.

Cú pháp:

const [state, formAction] = useActionState(fn, initialState, permalink?);

Trong đó:

  • fn: Một hàm được gọi khi form được submit. Nó nhận vào prevState (state trước đó) và formData.
  • initialState: Giá trị mặc định trước khi có bất kỳ submission nào.
  • permalink (tuỳ chọn): Một URL dùng để giữ lại state (rất phù hợp với Server Components).

Trả về:

  • state: State hiện tại của form.
  • formAction: Một hàm handler mà bạn truyền vào prop action của thẻ <form>.

Ví dụ 1: Form tăng số đơn giản

Giả sử bạn muốn có một nút bấm để tăng giá trị của bộ đếm mỗi khi được click (tức là gửi form). Đây là cách làm:

import { useActionState } from 'react'; async function increment(prevState, formData) { return prevState + 1;
} function CounterForm() { const [count, formAction] = useActionState(increment, 0); return ( <form action={formAction}> <p>Counter: {count}</p> <button type="submit">Increment</button> </form> );
}

Mỗi lần form được submit, hàm increment sẽ được chạy và cập nhật bộ đếm.

Ví dụ 2: Hiển thị thông báo lỗi trong form

Bạn có thể dùng useActionState để hiển thị thông báo lỗi khi việc gửi form thất bại — rất hữu ích trong các form có xác thực từ backend.

import { useActionState } from 'react';
import { addToCart } from './actions.js'; function AddToCartForm({ itemID, itemTitle }) { const [message, formAction] = useActionState(addToCart, null); return ( <form action={formAction}> <h2>{itemTitle}</h2> <input type="hidden" name="itemID" value={itemID} /> <button type="submit">Add to Cart</button> {message && <p className="error">{message}</p>} </form> );
} // actions.js (server function)
"use server"; export async function addToCart(prevState, formData) { const itemID = formData.get('itemID'); if (itemID === "1") { return "Added to cart"; } else { return "Couldn't add to cart: the item is sold out."; }
}

Mẫu này giúp bạn xử lý và hiển thị lỗi từ server mà không cần viết nhiều mã rườm rà.

Ví dụ 3: Giữ nguyên state form khi chuyển trang

Khi dùng thêm tham số permalink, useActionState có thể giữ lại trạng thái của form kể cả khi người dùng rời trang và quay lại.

import { useActionState } from 'react';
import { submitFeedback } from './actions.js'; function FeedbackForm() { const [feedback, formAction] = useActionState(submitFeedback, '', '/feedback'); return ( <form action={formAction}> <textarea name="feedback" placeholder="Your feedback" /> <button type="submit">Submit</button> <p>{feedback}</p> </form> );
}

Điều này đảm bảo trạng thái form vẫn còn khi điều hướng trang — cải thiện UX đáng kể, nhất là với form nhiều bước hoặc bố cục dạng persistent layout.

Khi nào không nên dùng useActionState?

Dù hook này rất mạnh mẽ, nhưng không phải lúc nào cũng phù hợp:

  • List Keys: Không nên dùng để tạo key trong danh sách — hãy dùng ID ổn định và duy nhất từ dữ liệu.
  • ID do người dùng kiểm soát: Nếu bạn lấy ID hoặc state từ cơ sở dữ liệu/API, bạn không cần đến useActionState.
  • UI động cao: Nếu bạn cần cập nhật state ở mỗi lần render (ví dụ như animation hoặc trạng thái tạm thời), hãy dùng useRef hoặc useState cục bộ.

Tổng kết

useActionState là một công cụ tuyệt vời để xử lý form trong React, đặc biệt là khi sử dụng Server Components.

Nó cho bạn quyền kiểm soát tốt hơn đối với kết quả form, dễ dàng xử lý thông báo lỗi, và hỗ trợ lưu state form qua các route.

Nếu bạn đang khám phá các tính năng mới nhất của React, việc thêm hook này vào "hộp công cụ" là điều hiển nhiên.

Chúc bạn code vui vẻ!

Bình luận

Bài viết tương tự

- vừa được xem lúc

Tìm hiểu về Redux Thunk

Chào mọi người, nếu bạn là người đã biết về React và đang làm quen với Redux chắc hẳn bạn đang rất mơ hồ về các khái niệm cơ bản của Redux như dispatch, store, action creator,... bạn còn đang vật lộn với đống document của Redux để hiểu những khái niệm đó và bạn nghe ai đó trong team nói về Redux Thu

0 0 404

- vừa được xem lúc

[React] Giới thiệu tổng quát về Redux Toolkit

1. Redux Toolkit (RTK) là gì và tại sao lại có nó. . .

0 0 6.7k

- vừa được xem lúc

Uống Pepsi code Vue đi - Uống Cocacola code React nha ;)

. (Nguồn ảnh: Internet). Chào các bạn, chào các bạn. Let's go . 1.

0 0 153

- vừa được xem lúc

Cài đặt taillwind css cho dự án React

Trong bài viết cùng mình tìm hiểu cách cài đặt tailwind css cho một dự án React sẵn có. .

0 0 153

- vừa được xem lúc

Formik vs React Hook Form (Phần 1)

Các lập trình viên Front End đều làm việc rất nhiều với form cùng sự phức tạp của ứng dụng. Do vậy chúng ta cần những thư viện form mạnh mẽ hỗ trợ quản lý các form state, form validation... Thành phần module. Formik bao gồm có 9 dependencies khác. . React Hook Form thì không có.

0 0 376

- vừa được xem lúc

Hướng dẫn React Redux cho người mới bắt đầu - Phần 1

Lời mởi đầu. Chào các bạn, ở thời điểm thực hiện bài viết này mình cũng là một người đang bắt đầu tìm hiểu và học với ReactJs và Redux, trong quá trình tìm hiểu đọc các tài liệu về thư viện này mình có tìm được một bài hướng dẫn khá hay nên đã quyết định chia sẻ với mọi người .

0 0 287