useFormStatus
Canary
Хук useFormStatus в настоящее время доступен только в каналах Canary и экспериментальных каналах React. Подробнее об этих каналах см. на странице каналов выпуска React.
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: Объект, реализующийFormData interface, содержащий данные, которые отправляет родительская<form>. Если нет активной отправки или нет родительской<form>, будетnull. -
method: Строковое значение, равное либо'get', либо'post'. Это указывает, отправляет ли родительская<form>данные сGETилиPOSTметодом HTTP. По умолчанию<form>использует методGETи может быть задан свойствомmethod.
-
action: Ссылка на функцию, переданную в свойствоactionродительской<form>. Если родительской<form>нет, свойство равноnull. Если предоставлено значение URI в свойствеactionили не задано свойствоaction,status.actionбудетnull.
Ограничения
- Хук
useFormStatusдолжен вызываться из компонента, отображаемого внутри<form>. -
useFormStatusвернёт информацию о статусе только для родительской<form>. Он не вернёт информацию о статусе<form>, отображённых в том же компоненте или дочерних компонентах.
Использование
Отображение состояния ожидания во время отправки формы
Чтобы отобразить состояние ожидания во время отправки формы, вы можете вызвать хук useFormStatus в компоненте, отображённом в <form>, и прочитать свойство 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 не вернёт информацию о статусе <form> , отображённом в том же компоненте.
Хук useFormStatus возвращает информацию о статусе только для родительской <form> и не для <form> , отображённых в том же компоненте, вызывающем хук, или в дочерних компонентах.
function Form() {
// 🚩 `pending` will never be true
// useFormStatus does not track the form rendered in this component
const { pending } = useFormStatus();
return <form action={submit}></form>;
}
Вместо этого вызовите useFormStatus из компонента, который находится внутри <form>.
function Submit() {
// ✅ `pending` will be derived from the form that wraps the Submit component
const { pending } = useFormStatus();
return <button disabled={pending}>...</button>;
}
function Form() {
// This is the <form> `useFormStatus` tracks
return (
<form action={submit}>
<Submit />
</form>
);
}
Чтение данных формы, которые отправляются
Вы можете использовать свойство data информации о статусе, возвращаемой из useFormStatus, чтобы отобразить данные, которые пользователь отправляет.
Здесь у нас есть форма, в которой пользователи могут запросить имя пользователя. Мы можем использовать 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> , отображаемого в том же компоненте. См. Раздел «Опасность» для получения дополнительной информации.
© 2013–present Facebook Inc.
Licensed under the Creative Commons Attribution 4.0 International Public License.
https://18.react.dev/reference/react-dom/hooks/useFormStatus