useFormStatus
useFormStatus es un Hook que brinda información de estado del último formulario enviado.
const { pending, data, method, action } = useFormStatus();Referencia
useFormStatus()
El Hook useFormStatus provee información de estado del último formulario enviado.
import { useFormStatus } from "react-dom";
import action from './actions';
function Submit() {
const status = useFormStatus();
return <button disabled={status.pending}>Enviar</button>
}
export default function App() {
return (
<form action={action}>
<Submit />
</form>
);
}Para obtener información de estado, el componente de Enviar tiene que ser renderizado dentro de un <form>. El Hook retorna información como la propiedad pending que te dice si el formulario se está enviando activamente.
En el ejemplo de arriba, Enviar usa esta información para deshabilitar la pulsación de <button> mientras el formulario se está enviando.
Parámetros
useFormStatus no toma ningún parámetro.
Retorna
Un objeto de status con las siguientes propiedades:
-
pending: Un booleano. Si estruesignifica que el<form>padre está pendiente de enviarse. De otro modo esfalse. -
data:Un objeto que implementa lainterfaz FormDataque contiene los datos que el<form>padre está enviando. Si no hay ningún envío activo o no hay<form>, va a sernull. -
method: El valor de un string ya sea'get'o'post'. Este representa si el<form>se está enviando con el método HTTPGEToPOST. Por defecto, un<form>va a usar el métodoGETy puede estar especificado con la propiedad demethod.
action: Una referencia a la función que es pasada al prop deactionen el<form>padre. Si no hay un<form>padre, la propiedad esnull. Si se ha proporcionado un valor URI al prop deaction, o no se ha especificado un prop deaction,status.actionva a sernull.
Advertencias
- El Hook
useFormStatusdebe llamarse desde un componente que se renderiza dentro de un<form>. useFormStatussolo retornará información de estado para un<form>padre. No retornará información de estado a ningún<form>renderizado en ese mismo componente o componente hijos.
Uso
Muestra un estado pendiente durante el envío de un formulario
Para mostrar un estado pendiente mientras un formulario se está enviando, puedes llamar al Hook useFormStatus en un componente renderizado en un <form> y leer la propiedad pending que retorna.
Aquí, usamos la propiedad pending para indicar que el formulario se está enviando.
import { useFormStatus } from "react-dom"; import { submitForm } from "./actions.js"; function Submit() { const { pending } = useFormStatus(); return ( <button type="submit" disabled={pending}> {pending ? "Enviando..." : "Enviar"} </button> ); } function Form({ action }) { return ( <form action={action}> <Submit /> </form> ); } export default function App() { return <Form action={submitForm} />; }
Lee los datos del formulario que se envían
Puedes usar la propiedad data de la información de estado que retorna del useFormStatus para mostrar qué datos está siendo enviando por el usuario.
Aquí, tenemos un formulario donde los usuarios pueden solicitar un nombre de usuario. Podemos usar useFormStatus para mostrar temporalmente un mensaje de estado que confirme qué nombre de usuario han solicitado.
import {useState, useMemo, useRef} from 'react'; import {useFormStatus} from 'react-dom'; export default function UsernameForm() { const {pending, data} = useFormStatus(); return ( <div> <h3>Solicita un nombre de usuario: </h3> <input type="text" name="username" disabled={pending}/> <button type="submit" disabled={pending}> Enviar </button> <br /> <p>{data ? `Solicitando ${data?.get("username")}...`: ''}</p> </div> ); }
Solución de problemas
status.pending nunca es true
useFormStatus solo retornará información de estado a un <form> padre.
Si el componente que llama a useFormStatus no está anidado en un <form>, status.pending siempre retornará false. Verifica que useFormStatus está siendo llamado en un componente que es hijo de un elemento <form>.
useFormStatus no rastreará al estado de un <form> renderizado en el mismo componente. Mira Atención para más detalles.