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>
์ ์ํ ์ ๋ณด๋ ๋ฐํํ์ง ์์ต๋๋ค.
์ฌ์ฉ๋ฒ
ํผ์ ์ ์ถํ๋ ๋์ ๋ณด๋ฅ ์ค์ธ ์ํ๋ก ํ์ํ๊ธฐ
ํผ์ ์ ์ถํ๋ ๋์ ๋ณด๋ฅ ์ํ๋ฅผ ํ์ํ๋ ค๋ฉด <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(); const [showSubmitted, setShowSubmitted] = useState(false); const submittedUsername = useRef(null); const timeoutId = useRef(null); useMemo(() => { if (pending) { submittedUsername.current = data?.get('username'); if (timeoutId.current != null) { clearTimeout(timeoutId.current); } timeoutId.current = setTimeout(() => { timeoutId.current = null; setShowSubmitted(false); }, 2000); setShowSubmitted(true); } }, [pending, data]); return ( <> <label>Request a Username: </label><br /> <input type="text" name="username" /> <button type="submit" disabled={pending}> {pending ? 'Submitting...' : 'Submit'} </button> {showSubmitted ? ( <p>Submitted request for username: {submittedUsername.current}</p> ) : null} </> ); }
๋ฌธ์ ํด๊ฒฐ
status.pending
์ด ์ ๋๋ก true
๊ฐ ๋์ง ์์ต๋๋ค
useFormStatus
๋ ์ค์ง ์์ <form>
์ ๋ํ ์ํ ์ ๋ณด๋ง ๋ฐํํฉ๋๋ค.
useFormStatus
๋ฅผ ํธ์ถํ๋ ์ปดํฌ๋ํธ๊ฐ <form>
์ ๊ฐ์ธ์ ธ ์์ง ์๋ค๋ฉด, status.pending
์ ํญ์ false
๋ฅผ ๋ฐํํฉ๋๋ค. useFormStatus
๊ฐ <form>
์๋ฆฌ๋จผํธ์ ์์ ์ปดํฌ๋ํธ์์ ํธ์ถ๋๋์ง ํ์ธํ์ธ์.
useFormStatus
๋ ๋์ผํ ์ปดํฌ๋ํธ์์ ๋ ๋๋งํ <form>
์ ์ํ๋ฅผ ์ถ์ ํ์ง ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ ์ฃผ์ํ์ธ์! ์์ ํ์ธํ ์ ์์ต๋๋ค.