useFormStatus
useFormStatus
é um Hook que te dá informações de status da última submissão do formulário.
const { pending, data, method, action } = useFormStatus();
Referência
useFormStatus()
O Hook useFormStatus
fornece informações de status da última submissão do formulário.
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>
);
}
Para obter informações de status, o componente Submit
deve ser renderizado dentro de um <form>
. O Hook retorna informações como a propriedade pending
, que te diz se o formulário está enviando ativamente.
No exemplo acima, Submit
usa essa informação para desabilitar os cliques no <button>
enquanto o formulário está enviando.
Parâmetros
useFormStatus
não aceita nenhum parâmetro.
Retorna
Um objeto status
com as seguintes propriedades:
-
pending
: Um booleano. Setrue
, isso significa que o<form>
pai está pendente de envio. Caso contrário,false
. -
data
: Um objeto implementando aFormData interface
que contém os dados que o<form>
pai está enviando. Se não houver envio ativo ou nenhum<form>
pai, ele seránull
. -
method
: Um valor de string de'get'
ou'post'
. Isso representa se o<form>
pai está enviando com um HTTP methodGET
ouPOST
. Por padrão, um<form>
usará o métodoGET
e pode ser especificado pela propriedademethod
.
action
: Uma referência para a função passada para a propaction
no<form>
pai. Se não houver um<form>
pai, a propriedade énull
. Se houver um valor URI fornecido para a propaction
, ou nenhuma propaction
especificada,status.action
seránull
.
Ressalvas
- O Hook
useFormStatus
deve ser chamado de um componente que é renderizado dentro de um<form>
. useFormStatus
só retornará informações de status para um<form>
pai. Ele não retornará informações de status para nenhum<form>
renderizado no mesmo componente ou em componentes filhos.
Uso
Exibir um estado pendente durante o envio do formulário
Para exibir um estado pendente enquanto um formulário está enviando, você pode chamar o Hook useFormStatus
em um componente renderizado em um <form>
e ler a propriedade pending
retornada.
Aqui, usamos a propriedade pending
para indicar que o formulário está sendo enviado.
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} />; }
Ler os dados do formulário que estão sendo enviados
Você pode usar a propriedade data
das informações de status retornadas de useFormStatus
para exibir quais dados estão sendo enviados pelo usuário.
Aqui, temos um formulário onde os usuários podem solicitar um nome de usuário. Podemos usar useFormStatus
para exibir uma mensagem de status temporária confirmando qual nome de usuário eles solicitaram.
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> ); }
Solução de problemas
status.pending
nunca é true
useFormStatus
só retornará informações de status para um <form>
pai.
Se o componente que chama useFormStatus
não estiver aninhado em um <form>
, status.pending
sempre retornará false
. Verifique se useFormStatus
é chamado em um componente que é filho de um elemento <form>
.
useFormStatus
não rastreará o status de um <form>
renderizado no mesmo componente. Veja Ressalva para mais detalhes.