useFormStatus
useFormStatus
là một Hook cung cấp cho bạn thông tin trạng thái của lần gửi biểu mẫu cuối cùng.
const { pending, data, method, action } = useFormStatus();
Tham khảo
useFormStatus()
Hook useFormStatus
cung cấp thông tin trạng thái của lần gửi biểu mẫu cuối cùng.
import { useFormStatus } from "react-dom";
import action from './actions';
function Submit() {
const status = useFormStatus();
return <button disabled={status.pending}>Submit</button>
}
export default function App() {
return (
<form action={action}>
<Submit />
</form>
);
}
Để lấy thông tin trạng thái, component Submit
phải được render bên trong một <form>
. Hook trả về thông tin như thuộc tính pending
cho bạn biết nếu biểu mẫu đang được gửi.
Trong ví dụ trên, Submit
sử dụng thông tin này để vô hiệu hóa các lần nhấn <button>
trong khi biểu mẫu đang được gửi.
Tham số
useFormStatus
không nhận bất kỳ tham số nào.
Giá trị trả về
Một đối tượng status
với các thuộc tính sau:
-
pending
: Một giá trị boolean. Nếutrue
, điều này có nghĩa là<form>
cha đang chờ gửi. Ngược lại,false
. -
data
: Một đối tượng triển khaiFormData interface
chứa dữ liệu mà<form>
cha đang gửi. Nếu không có gửi hoạt động hoặc không có<form>
cha, nó sẽ lànull
. -
method
: Một giá trị chuỗi là'get'
hoặc'post'
. Điều này thể hiện việc<form>
cha đang gửi bằng phương thức HTTPGET
hoặcPOST
. Theo mặc định, một<form>
sẽ sử dụng phương thứcGET
và có thể được chỉ định bởi thuộc tínhmethod
.
action
: Một tham chiếu đến hàm được truyền cho propaction
trên<form>
cha. Nếu không có<form>
cha, thuộc tính lànull
. Nếu có một giá trị URI được cung cấp cho propaction
hoặc không có propaction
nào được chỉ định,status.action
sẽ lànull
.
Lưu ý
- Hook
useFormStatus
phải được gọi từ một component được render bên trong một<form>
. useFormStatus
sẽ chỉ trả về thông tin trạng thái cho một<form>
cha. Nó sẽ không trả về thông tin trạng thái cho bất kỳ<form>
nào được render trong cùng một component hoặc các component con.
Cách sử dụng
Hiển thị trạng thái chờ trong khi gửi biểu mẫu
Để hiển thị trạng thái chờ trong khi biểu mẫu đang được gửi, bạn có thể gọi Hook useFormStatus
trong một component được render trong một <form>
và đọc thuộc tính pending
được trả về.
Ở đây, chúng ta sử dụng thuộc tính pending
để chỉ ra rằng biểu mẫu đang được gửi.
import { useFormStatus } from "react-dom"; import { submitForm } from "./actions.js"; function Submit() { const { pending } = useFormStatus(); return ( <button type="submit" disabled={pending}> {pending ? "Đang gửi..." : "Gửi"} </button> ); } function Form({ action }) { return ( <form action={action}> <Submit /> </form> ); } export default function App() { return <Form action={submitForm} />; }
Đọc dữ liệu biểu mẫu đang được gửi
Bạn có thể sử dụng thuộc tính data
của thông tin trạng thái được trả về từ useFormStatus
để hiển thị dữ liệu đang được người dùng gửi.
Ở đây, chúng ta có một biểu mẫu nơi người dùng có thể yêu cầu tên người dùng. Chúng ta có thể sử dụng useFormStatus
để hiển thị một thông báo trạng thái tạm thời xác nhận tên người dùng mà họ đã yêu cầu.
import {useState, useMemo, useRef} from 'react'; import {useFormStatus} from 'react-dom'; export default function UsernameForm() { const {pending, data} = useFormStatus(); return ( <div> <h3>Yêu cầu tên người dùng: </h3> <input type="text" name="username" disabled={pending}/> <button type="submit" disabled={pending}> Gửi </button> <br /> <p>{data ? `Đang yêu cầu ${data?.get("username")}...`: ''}</p> </div> ); }
Gỡ rối
status.pending
không bao giờ là true
useFormStatus
sẽ chỉ trả về thông tin trạng thái cho một <form>
cha.
Nếu component gọi useFormStatus
không được lồng trong một <form>
, status.pending
sẽ luôn trả về false
. Xác minh useFormStatus
được gọi trong một component là con của một phần tử <form>
.
useFormStatus
sẽ không theo dõi trạng thái của một <form>
được render trong cùng một component. Xem Pitfall để biết thêm chi tiết.