useFormStatus は、最後のフォーム送信のステータス情報を提供するフックです。
const { pending, data, method, action } = useFormStatus();リファレンス
useFormStatus()
useFormStatus フックは、最後のフォーム送信のステータス情報を提供します。
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>
);
}ステータス情報を取得するには、Submit コンポーネントを <form> 内にレンダリングする必要があります。このフックは、フォームがアクティブに送信中かどうかを示す pending プロパティなどの情報を返します。
上記の例では、Submit はこの情報を使用して、フォームの送信中に <button> の押下を無効にしています。
パラメータ
useFormStatus はパラメータを取りません。
戻り値
以下のプロパティを持つ status オブジェクト
-
pending: ブール値。trueの場合、親の<form>は送信を保留中です。それ以外の場合は、falseです。 -
data: 親の<form>が送信しているデータを含むFormData インターフェースを実装するオブジェクト。アクティブな送信がない場合、または親の<form>がない場合、nullになります。 -
method: 文字列値で、'get'または'post'のいずれかです。これは、親要素の<form>がGETまたはPOSTのどちらの HTTP メソッド で送信されるかを表します。デフォルトでは、<form>はGETメソッドを使用し、methodプロパティで指定できます。
action: 親要素の<form>のactionprop に渡された関数への参照です。親要素の<form>がない場合、このプロパティはnullです。actionprop に URI 値が指定されている場合、またはactionprop が指定されていない場合、status.actionはnullになります。
注意事項
useFormStatusHook は、<form>内でレンダリングされるコンポーネントから呼び出す必要があります。useFormStatusは、親要素の<form>のステータス情報のみを返します。同じコンポーネントまたは子コンポーネントでレンダリングされた<form>のステータス情報は返しません。
使用方法 (SVGアイコン)
フォーム送信中の保留状態を表示する (SVGアイコン)
フォームの送信中に保留状態を表示するには、<form> でレンダリングされたコンポーネントで useFormStatus Hook を呼び出し、返された pending プロパティを読み取ります。
ここでは、pending プロパティを使用して、フォームが送信中であることを示します。
import { useFormStatus } from "react-dom"; import { submitForm } from "./actions.js"; function Submit() { const { pending } = useFormStatus(); return ( <button type="submit" disabled={pending}> {pending ? "Submitting..." : "Submit"} </button> ); } function Form({ action }) { return ( <form action={action}> <Submit /> </form> ); } export default function App() { return <Form action={submitForm} />; }
送信されるフォームデータを読み取る (SVGアイコン)
useFormStatus から返されたステータス情報の data プロパティを使用して、ユーザーが送信しているデータを表示できます。
ここでは、ユーザーがユーザー名をリクエストできるフォームがあります。useFormStatus を使用して、リクエストしたユーザー名を確認する一時的なステータスメッセージを表示できます。
import {useState, useMemo, useRef} from 'react'; import {useFormStatus} from 'react-dom'; export default function UsernameForm() { const {pending, data} = useFormStatus(); return ( <div> <h3>Request a Username: </h3> <input type="text" name="username" disabled={pending}/> <button type="submit" disabled={pending}> Submit </button> <br /> <p>{data ? `Requesting ${data?.get("username")}...`: ''}</p> </div> ); }
トラブルシューティング ...
status.pending が true になることはありません ...
useFormStatus は、親の <form> のステータス情報のみを返します。
useFormStatus を呼び出すコンポーネントが <form> 内にネストされていない場合、status.pending は常に false を返します。useFormStatus が <form> 要素の子であるコンポーネントで呼び出されていることを確認してください。
useFormStatus は、同じコンポーネントでレンダリングされた <form> のステータスを追跡しません。詳細は落とし穴を参照してください。