React19 useFormStauts Hook

2025. 2. 26. 23:58·⭐FE

🧩배경

react19 에 도입된 새로운 hook `useFormStatus` 학습 

🧩useFormStatus

`useFormStatus`는 마지막 폼 제출 정보의 상태를 알려주는 hook 이다. 

const { pending, data, method, action } = useFormStatus();

와 같이 사용 한다. 

🧩레퍼런스

아래는 사용 예시이다. 아래 보면 `Submit()` 컴포넌트 내부에서 `useFormStatus()` 가 사용되었고 그 `Submit()`컴포넌트는 <form> 태그 내부 배치되어 있다. 이처럼 useFormStatus를 사용하기 위해서는 <form>태그 내부에서 해당 코드가 존재해야 한다. 

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>
  );
}

위 코드에서 form이 제출되는 동안 status.pending은 true가 되고 제출이 끝나면 false가 될 것이다. 개발자가 별도의 pending 상태를 state로 설정하는 것 없이 해당기능을 바로 사용할 수 있어서 매우 편해보인다. 

🧩파라미터

위 예시코드에서 보았듯이 `useFormStatus`는 별도로 받는 파라미터가 존재하지 않는다. 요구 조건은 <form> 태그 내부에서의 호출 빼곤 없어보인다.

🧩리턴값

  • pending : `boolean` type으로 true일 경우 parent <form>이 제출중인 상태이고 그 반대일 경우 false 이다. 
  • data : FormData  객체 형태로 parent <form>이 제출한 data를 포함하고 있다. 제출되지 않았거나 parent <form>이 없으면 `null` 로 대체된다.
  • method: `string` 타입으로 말그대로 get 아니면 post이다. submit 이 get 형태로 제출됐는지 post 형태로 제출됐는지 알 수 있으며 별도 설정이 없으면 디폴트로 설정된 get으로 나타날 것이다. 
  • action: parent <form>에 전달된 action 속성을 나타낸다. 대신 parent <form>이 존재하지 않으면 `null` 값으로 대체된다. 그리고 action props에 url가 직접 전달되거나 아예 전달되는 것이 없으면 `null`값으로 대체된다. 이 외에는 action props에 전달된 함수가 action의 값으로 return 될 것이다.

🧩주의사항

  • `useFormStatus` Hook은 <form> 태그 내부에서 렌더되는 컴포넌트 내부에서 호출되어야 된다
  • `useFromStatus` 는 오로지 부모 <form> 태그를 위한 정보만을 return 한다. 같은 컴포넌트 내부에서 렌더되는 다른 <form>에 대한 정보는 리턴하지 않는다. ( 자식 컴포넌트 또한 마찬가지 ) 

🧩주의사항 예시 코드  

`useFormStatus` 는 같은 컴포넌트에서 렌더되는 <form>에 대한 정보 status를 return 하지 않는다. 

`useFormStatus` Hook은 오직 parent <form>에 대한 정보 status만을 return 한다. 같은 컴포넌트 내부에서 render 되는 <form>에 대한 status는 return 하지 않는다.

function Form() {
  // 🚩 `pending` will never be true
  // useFormStatus does not track the form rendered in this component
  const { pending } = useFormStatus();
  return <form action={submit}></form>;
}

위와 같이 사용하면 안되고 <form> 태그 내부에 존재하는 컴포넌트 내부에서 `useFormStatus`를 호출해야 한다. (아래 예시)

function Submit() {
  // ✅ `pending` will be derived from the form that wraps the Submit component
  const { pending } = useFormStatus(); 
  return <button disabled={pending}>...</button>;
}

function Form() {
  // This is the <form> `useFormStatus` tracks
  return (
    <form action={submit}>
      <Submit />
    </form>
  );
}

🧩제출한 폼 데이터 읽기

제출한 폼의 데이터를 알기 위해 우리는 `useFromStatus`에 의해 return 되는 값 중 `data`를 이용할 수 있다. 아래 예시는 사용자가 제출한 이름을 알 수 있도록 화면에 보여주는 예시이다. 

// 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>
  );
}

위 코드에서 보면 알 수 있듯이 <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>
  );
}

`<UsernameForm>` 컴포넌트 내부에서 `useFormStatus`가 호출된다. 사용자가 submit 버튼을 클릭시 사용자가 input에 입력한 값은 FormData 객체에 name : '입력값` 형태로 담기며 제출 될 것이다. 동시에 해당 FormData 객체정보는 `useFormStatus`를 통해 return 되는 값중 `data`로 접근 가능하다. 이 `data`를 이용하여 입력값을 화면에 출력 할 수 있다.

➕후기

공식문서를 쭉읽으면서 새로운 hook에 대해 파악해봤는데 19를 사용하게 되면 굉장히 편하게 이용할 수 있겠다는 생각이 들었다. 19의 다른 hook `useActionState`를 좀 자세히 공부하고 활용해봐서 그런지 쉽게 이해되고 눈에 잘 들어왔다.

⭐참고

https://react.dev/reference/react-dom/hooks/useFormStatus

 

useFormStatus – React

The library for web and native user interfaces

react.dev

'⭐FE' 카테고리의 다른 글

Stacking Context ( 쌓임 맥락 )  (0) 2025.03.29
React19 useOptimistic Hook  (0) 2025.03.03
React19 useActionState Hook 활용 예시  (0) 2025.02.23
React Server Component  (0) 2025.02.17
Lodash debounce 탐색  (1) 2025.01.29
'⭐FE' 카테고리의 다른 글
  • Stacking Context ( 쌓임 맥락 )
  • React19 useOptimistic Hook
  • React19 useActionState Hook 활용 예시
  • React Server Component
devWarrior
devWarrior
  • devWarrior
    devWarrior
    devWarrior
  • 전체
    오늘
    어제
    • 🧩Dev (263)
      • ⭐FE (34)
      • 🔒Algorithm (155)
      • ➕Etc. (11)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    node.js
    프론트엔드
    백준
    Algorithm
    코딩테스트
    BFS
    Easy
    Lv2
    골드5
    leetcode
    DFS
    실버4
    실버1
    프로그래머스
    js
    dp
    실버2
    코테
    실버3
    오블완
    티스토리챌린지
    nodejs
    구현
    알고리즘
    그리디
    FE
    자바스크립트
    javascript
    자스
    react
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
devWarrior
React19 useFormStauts Hook
상단으로

티스토리툴바