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>
);
}
要获取状态信息,必须在 <form>
中渲染 Submit
组件。该 Hook 返回诸如 pending
属性之类的信息,该属性告诉您表单是否正在积极提交。
在上面的示例中,Submit
使用此信息在表单提交时禁用 <button>
的点击操作。
参数
useFormStatus
不带任何参数。
返回值
一个包含以下属性的 status
对象
-
pending
: 一个布尔值。如果为true
,则表示父级<form>
正在等待提交。否则,为false
。 -
data
: 一个实现FormData 接口
的对象,其中包含父级<form>
正在提交的数据。如果没有正在进行的提交或没有父级<form>
,它将为null
。 -
method
:一个字符串值,可以是'get'
或'post'
。这表示父级<form>
是使用GET
还是POST
HTTP 方法提交的。默认情况下,<form>
将使用GET
方法,并且可以通过method
属性指定。
action
:对传递给父级<form>
上的action
属性的函数的引用。如果没有父级<form>
,则该属性为null
。如果为action
属性提供了 URI 值,或者未指定action
属性,则status.action
将为null
。
注意事项
useFormStatus
钩子必须从在<form>
内呈现的组件中调用。useFormStatus
只会返回父级<form>
的状态信息。它不会返回在同一个组件或子组件中呈现的任何<form>
的状态信息。
用法
在表单提交期间显示 pending 状态
要在表单提交时显示 pending 状态,您可以在 <form>
中呈现的组件中调用 useFormStatus
钩子,并读取返回的 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> ); }
故障排除
status.pending
永远不会是 true
useFormStatus
只会返回父级 <form>
的状态信息。
如果调用 useFormStatus
的组件没有嵌套在 <form>
中,则 status.pending
将始终返回 false
。请验证 useFormStatus
是否在 <form>
元素的子组件中调用。
useFormStatus
不会跟踪在同一个组件中渲染的 <form>
的状态。有关更多详细信息,请参阅常见问题。