useFormStatus
是一個 Hook,可以提供您最後一次表單提交的狀態資訊。
const { pending, data, method, action } = useFormStatus();
參考
useFormStatus()
useFormStatus
Hook 提供最後一次表單提交的狀態資訊。
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>
內。這個 Hook 會傳回資訊,例如 pending
屬性,它會告訴您表單是否正在 actively 提交中。
在上面的例子中,Submit
使用這個資訊來停用表單提交期間的 <button>
按鈕。
參數
useFormStatus
不需要任何參數。
回傳值
一個具有以下屬性的 status
物件
-
pending
:一個布林值。如果為true
,表示父層<form>
正在等待提交。否則為false
。 -
data
:一個實作FormData 介面
的物件,其中包含父層<form>
正在提交的資料。如果沒有 active 的提交或沒有父層<form>
,它將會是null
。 -
method
:字串值,可以是'get'
或'post'
。這表示父層<form>
正在使用GET
或POST
HTTP 方法 提交。預設情況下,<form>
將使用GET
方法,並且可以通過method
屬性來指定。
action
:參照父層 `<form>
` 中 `action` prop 傳入的函式。如果沒有父層 `<form>
`,則此屬性為 `null`。如果 `action` prop 提供了 URI 值,或者沒有指定 `action` prop,則 `status.action` 將會是 `null`。
注意事項
- `useFormStatus` Hook 必須從渲染在 `
<form>
` 內部的元件呼叫。 - `useFormStatus` 只會回傳父層 `
<form>
` 的狀態資訊。它不會回傳在同一個元件或子元件中渲染的任何 `<form>
` 的狀態資訊。
用法 ...
在表單提交期間顯示處理中狀態 ...
要在表單提交時顯示處理中狀態,您可以在 `<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} />; }
讀取正在提交的表單資料 ...
您可以使用從 `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> ); }