ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

web/react dom hook

useFormStatus

dev_been94 2024. 12. 16. 16:58
728x90
๋ฐ˜์‘ํ˜•

useFormStatus

 

๐ŸŽฏ useFormStatus๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

**useFormStatus**๋Š” ํผ(form)์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” React์˜ ํ›…์ด์—์š”.

  • ์˜ˆ๋ฅผ ๋“ค์–ด, "ํผ์ด ์ œ์ถœ ์ค‘์ธ์ง€", "์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋Š”์ง€" ๊ฐ™์€ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์ฃ .
  • ์ฃผ๋กœ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์ถœํ•˜๋Š” ์ž‘์—…๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ผ์š”.

 

๐Ÿ• ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ: ํ–„๋ฒ„๊ฑฐ ๊ฐ€๊ฒŒ ์ฃผ๋ฌธ ์ƒํ™ฉ ๐Ÿ”

์—ฌ๋Ÿฌ๋ถ„์ด ํ–„๋ฒ„๊ฑฐ ๊ฐ€๊ฒŒ์—์„œ ์ฃผ๋ฌธ์„ ๋ฐ›๋Š” ์ง์›์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”.

  1. ์ฃผ๋ฌธ ์‹œ์ž‘
    • ์†๋‹˜์ด ๋ฉ”๋‰ด๋ฅผ ๊ณ ๋ฅด๊ณ  ์ฃผ๋ฌธ์„ ์‹œ์ž‘ํ•ด์š”.
    • ์ด๋•Œ **"์ฃผ๋ฌธ์ด ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค"**๋ผ๋Š” ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.
  2. ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ์ค‘
    • ์ฃผ๋ฐฉ์—์„œ ํ–„๋ฒ„๊ฑฐ๋ฅผ ๋งŒ๋“œ๋Š” ๋™์•ˆ **"์ฃผ๋ฌธ์ด ์ฒ˜๋ฆฌ ์ค‘์ด์—์š”"**๋ผ๋Š” ์ƒํƒœ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  3. ์ฃผ๋ฌธ ์™„๋ฃŒ
    • ํ–„๋ฒ„๊ฑฐ๊ฐ€ ์™„์„ฑ๋˜๋ฉด **"์ฃผ๋ฌธ์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!"**๋ผ๊ณ  ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ์ฃ .

React์˜ **useFormStatus**๋Š” ๋ฐ”๋กœ ์ด **์ฃผ๋ฌธ ์ƒํƒœ(์ง„ํ–‰ ์ค‘, ์™„๋ฃŒ, ์—๋Ÿฌ ๋“ฑ)**๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ์—ญํ• ์ด์—์š”.

 

๐Ÿ› ๏ธ useFormStatus ์‚ฌ์šฉ๋ฒ•

๊ทธ๋Ÿผ useFormStatus๋ฅผ ์ฝ”๋“œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ•จ๊ป˜ ์•Œ์•„๋ณผ๊ฒŒ์š”.
React ์„œ๋ฒ„ ์•ก์…˜์„ ์˜ˆ์ œ๋กœ ๋ณด์—ฌ๋“œ๋ฆด๊ฒŒ์š”.

 

1. ์„œ๋ฒ„ ์•ก์…˜์œผ๋กœ ๋ฐ์ดํ„ฐ ์ œ์ถœํ•˜๊ธฐ

React ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํผ ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์— ์ œ์ถœํ•  ๋•Œ useFormStatus๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”.

์„œ๋ฒ„ ์•ก์…˜ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

'use server';

export async function submitFormAction(formData) {
  const name = formData.get('name');

  // 2์ดˆ ๋™์•ˆ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌ ์ค‘์ด๋ผ๊ณ  ๊ฐ€์ •
  await new Promise((resolve) => setTimeout(resolve, 2000));

  if (!name) {
    throw new Error('์ด๋ฆ„์„ ์ž…๋ ฅํ•ด ์ฃผ์„ธ์š”!');
  }

  console.log('์„œ๋ฒ„์— ์ „์†ก๋œ ๋ฐ์ดํ„ฐ:', name);
}

์„ค๋ช…:

  • submitFormAction ํ•จ์ˆ˜๋Š” ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•ด์š”.
  • await๋กœ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ‰๋‚ด๋‚ด์„œ ํผ์ด ์ œ์ถœ๋˜๋Š” ๋™์•ˆ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ƒํ™ฉ์„ ๋งŒ๋“ค์–ด ๋ณผ๊ฒŒ์š”.

 

2. useFormStatus๋ฅผ ์‚ฌ์šฉํ•œ ํผ ์ปดํฌ๋„ŒํŠธ

์ด์ œ useFormStatus๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํผ ์ƒํƒœ๋ฅผ ํ‘œ์‹œํ•ด๋ณผ๊ฒŒ์š”.

'use client';

import { useFormStatus } from 'react-dom';
import { submitFormAction } from './actions';

function SubmitButton() {
  const { pending } = useFormStatus(); // ํผ ์ƒํƒœ ํ™•์ธ

  return (
    <button type="submit" disabled={pending}>
      {pending ? '์ œ์ถœ ์ค‘...' : '์ œ์ถœ'}
    </button>
  );
}

export default function MyForm() {
  return (
    <form action={submitFormAction}>
      <label>
        ์ด๋ฆ„: <input name="name" />
      </label>
      <SubmitButton />
    </form>
  );
}

๐Ÿ” ์ฝ”๋“œ ์„ค๋ช…

  1. useFormStatus ํ›…
    • useFormStatus๋Š” ํผ์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํ›…์ด์—์š”.
    • pending: ํผ์ด ์ œ์ถœ ์ค‘์ด๋ฉด true, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด false๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  2. SubmitButton ์ปดํฌ๋„ŒํŠธ
    • useFormStatus๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฒ„ํŠผ์˜ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•ด์š”.
    • ํผ์ด ์ œ์ถœ ์ค‘์ด๋ฉด ๋ฒ„ํŠผ์— **"์ œ์ถœ ์ค‘..."**์ด๋ผ๊ณ  ํ‘œ์‹œํ•˜๊ณ , ํด๋ฆญ์„ ๋น„ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.
  3. action ์†์„ฑ
    • form ํƒœ๊ทธ์˜ action ์†์„ฑ์— ์„œ๋ฒ„ ์•ก์…˜ ํ•จ์ˆ˜ submitFormAction์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
    • ํผ์ด ์ œ์ถœ๋˜๋ฉด ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ  ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ฒฐ๊ณผ
    • ํผ์ด ์ œ์ถœ ์ค‘์ผ ๋•Œ ๋ฒ„ํŠผ์€ ๋น„ํ™œ์„ฑํ™”๋˜๊ณ  **"์ œ์ถœ ์ค‘..."**์ด๋ผ๋Š” ๋ฌธ๊ตฌ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
    • ์ œ์ถœ์ด ์™„๋ฃŒ๋˜๋ฉด ๋ฒ„ํŠผ์ด ๋‹ค์‹œ ํ™œ์„ฑํ™”๋ผ์š”.

 

๐Ÿš€ useFormStatus๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์€ ์ 

  1. ์ œ์ถœ ์ƒํƒœ๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌ
    • ํผ์ด ์ œ์ถœ ์ค‘์ธ์ง€, ์™„๋ฃŒ๋๋Š”์ง€ ์ƒํƒœ๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”.
  2. UX(์‚ฌ์šฉ์ž ๊ฒฝํ—˜) ๊ฐœ์„ 
    • ํผ์ด ์ œ์ถœ๋˜๋Š” ๋™์•ˆ ๋ฒ„ํŠผ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ฑฐ๋‚˜ ๋กœ๋”ฉ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•ด์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ”ผ๋“œ๋ฐฑ์„ ์ค„ ์ˆ˜ ์žˆ์–ด์š”.
  3. ์„œ๋ฒ„ ์•ก์…˜๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉ
    • ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ์ถœํ•˜๋Š” ์ž‘์—…๊ณผ useFormStatus๋ฅผ ๊ฒฐํ•ฉํ•˜๋ฉด ์„œ๋ฒ„์™€์˜ ์ƒํƒœ ๋™๊ธฐํ™”๊ฐ€ ํ›จ์”ฌ ์‰ฌ์›Œ์ ธ์š”.

 

๐ŸŒŸ ํ•œ ์ค„ ์š”์•ฝ

**useFormStatus**๋Š” ํผ์ด ์ œ์ถœ ์ค‘์ธ์ง€, ์™„๋ฃŒ๋๋Š”์ง€ ๋“ฑ ์ƒํƒœ๋ฅผ ํ™•์ธํ•ด์„œ ํ™”๋ฉด์— ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” React ํ›…์ด์—์š”.

 

๐ŸŽ‰ ๋งˆ๋ฌด๋ฆฌ

React์˜ **useFormStatus**๋Š” ํผ์„ ์‚ฌ์šฉํ•  ๋•Œ **"์ง€๊ธˆ ํผ์ด ์–ด๋–ค ์ƒํƒœ์ธ์ง€"**๋ฅผ ๋” ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด์—์š”.
ํŠนํžˆ ์„œ๋ฒ„ ์•ก์…˜๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๊น”๋”ํ•ด์ง€๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ด ์ข‹์•„์ง€์ฃ !

728x90
๋ฐ˜์‘ํ˜•
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/02   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•
250x250