useFormStatus 마지막 form 제출의 상태 정보를 제공하는 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은 form이 제출되고 있는지 알려주는 pending과 같은 정보를 반환한다.
위의 예에서 Submit은 이 정보를 사용하여 form이 제출되는 동안 button 클릭을 비활성화한다.
useFormStatus는 매개변수를 사용하지 않는다.
form 제출 중 pending 상태 표시
form이 제출되는 동안 pending 상태를 표시하려면 form에 렌더링된 컴포넌트에서 useFormStatus Hook을 호출하고 반환된 pending 속성을 사용할 수 있다.
아래에서는 pending 속성을 사용하여 form이 제출 중임을 나타낸다.
예시코드
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 속성을 사용하여 사용자가 제출하는 데이터를 표시할 수 있다.
아래 코드에는 사용자가 사용자 이름을 요청할 수 있는 form이 있다. useFormStatus를 사용하여 요청한 사용자 이름을 확인하는 임시 상태 메시지를 표시할 수 있다.
UsernameForm.js
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>
);
}
App.js
import UsernameForm from './UsernameForm';
import { submitForm } from "./actions.js";
import {useRef} from 'react';
export default function App() {
const ref = useRef(null);
return (
<form ref={ref} action={async (formData) => {
await submitForm(formData);
ref.current.reset();
}}>
<UsernameForm />
</form>
);
}
간단 정리