useFormStatus
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>
);
}์ํ ์ ๋ณด๋ฅผ ์ ๊ณต๋ฐ๊ธฐ ์ํด Submit ์ปดํฌ๋ํธ๋ฅผ <form> ๋ด๋ถ์ ๋ ๋๋งํด์ผ ํฉ๋๋ค. ์ด Hook์ ํผ์ด ํ์ฌ ์ ์ถํ๊ณ ์๋ ์ํ์ธ์ง๋ฅผ ์๋ฏธํ๋ pending ํ๋กํผํฐ์ ๊ฐ์ ์ํ ์ ๋ณด๋ฅผ ๋ฐํํฉ๋๋ค.
์์ ์์์์ Submit ์ปดํฌ๋ํธ๋ ํผ์ด ์ ์ถ ์ค์ผ ๋ <button>์ ๋๋ฅผ ์ ์๋๋ก ํ๊ธฐ ์ํด ์ด ์ ๋ณด๋ฅผ ํ์ฉํฉ๋๋ค.
์๋ ์์๋ฅผ ์ฐธ๊ณ ํ์ธ์.
๋งค๊ฐ๋ณ์
useFormStatus์ ์ด๋ค ๋งค๊ฐ๋ณ์๋ ๋ฐ์ง ์์ต๋๋ค.
๋ฐํ๊ฐ
๋ค์์ ํ๋กํผํฐ๋ฅผ ๊ฐ์ง๋ status ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
-
pending: ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋๋ค.true๋ผ๋ฉด ์์<form>์ด ์์ง ์ ์ถ ์ค์ด๋ผ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉดfalse์ ๋๋ค. -
data:FormData์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ฐ์ฒด๋ก, ์์<form>์ด ์ ์ถํ๋ ๋ฐ์ดํฐ๋ฅผ ํฌํจํฉ๋๋ค. ํ์ฑํ๋ ์ ์ถ์ด ์๊ฑฐ๋ ์์์<form>์ด ์๋ ๊ฒฝ์ฐ์๋null์ ๋๋ค. -
method:'get'๋๋'post'์ค ํ๋์ ๋ฌธ์์ด ๊ฐ์ ๋๋ค. ์ด ํ๋กํผํฐ๋ ์์<form>์ดGET๋๋POSTHTTP ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ถ๋๋์ง๋ฅผ ๋ํ๋ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก<form>์GET๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉฐmethodํ๋กํผํฐ๋ฅผ ํตํด ์ง์ ํ ์ ์์ต๋๋ค.
action: ์์<form>์actionProp์ ์ ๋ฌํ ํจ์์ ๋ ํผ๋ฐ์ค์ ๋๋ค. ์์<form>์ด ์๋ ๊ฒฝ์ฐ์๋ ์ด ํ๋กํผํฐ๋null์ ๋๋ค.actionProp์ URI ๊ฐ์ด ์ ๊ณต๋์๊ฑฐ๋actionprop๋ฅผ ์ง์ ํ์ง ์์์ ๊ฒฝ์ฐ์๋status.action์null์ ๋๋ค.
์ฃผ์ ์ฌํญ
useFormStatusHook์<form>๋ด๋ถ์ ๋ ๋๋งํ ์ปดํฌ๋ํธ์์ ํธ์ถํด์ผ ํฉ๋๋ค.useFormStatus๋ ์ค์ง ์์<form>์ ๋ํ ์ํ ์ ๋ณด๋ง ๋ฐํํฉ๋๋ค. ๋์ผํ ์ปดํฌ๋ํธ๋ ์์ ์ปดํฌ๋ํธ์์ ๋ ๋๋งํ<form>์ ์ํ ์ ๋ณด๋ ๋ฐํํ์ง ์์ต๋๋ค.
์ฌ์ฉ๋ฒ
ํผ์ ์ ์ถํ๋ ๋์ ๋๊ธฐ ์ค์ธ ์ํ๋ก ํ์ํ๊ธฐ
ํผ์ ์ ์ถํ๋ ๋์ ๋๊ธฐPending ์ํ๋ฅผ ํ์ํ๋ ค๋ฉด <form> ๋ด์์ ๋ ๋๋งํ ์ปดํฌ๋ํธ์์ useFormStatus Hook์ ํธ์ถํ๊ณ ๋ฐํ๋ 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>์ ์ํ๋ฅผ ์ถ์ ํ์ง ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ โ์ฃผ์ํ์ธ์!โ์์ ํ์ธํ ์ ์์ต๋๋ค.