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
๋๋POST
HTTP ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ถ๋๋์ง๋ฅผ ๋ํ๋ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก<form>
์GET
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉฐmethod
ํ๋กํผํฐ๋ฅผ ํตํด ์ง์ ํ ์ ์์ต๋๋ค.
action
: ์์<form>
์action
Prop์ ์ ๋ฌํ ํจ์์ ๋ ํผ๋ฐ์ค์ ๋๋ค. ์์<form>
์ด ์๋ ๊ฒฝ์ฐ์๋ ์ด ํ๋กํผํฐ๋null
์ ๋๋ค.action
Prop์ URI ๊ฐ์ด ์ ๊ณต๋์๊ฑฐ๋action
prop๋ฅผ ์ง์ ํ์ง ์์์ ๊ฒฝ์ฐ์๋status.action
์null
์ ๋๋ค.
์ฃผ์ ์ฌํญ
useFormStatus
Hook์<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>
์ ์ํ๋ฅผ ์ถ์ ํ์ง ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ โ์ฃผ์ํ์ธ์!โ์์ ํ์ธํ ์ ์์ต๋๋ค.