Submit 버튼은 자신을 감싼 form이 제출 중인지 알아야 해. useFormStatus를 쓰면 부모가 대기 상태를 일일이 내려주지 않아도 돼.
기본 모양
const { pending, data, method, action } = useFormStatus()를 form 안에서 렌더링되는 자식 컴포넌트에 호출해. 가장 자주 쓰는 값은 제출이 진행 중인지 알려 주는 pending이야.
가장 가까운 form을 읽는다
useFormStatus는 컴포넌트를 감싸는 가장 가까운 form의 상태를 읽어. form의 자식이 아닌 곳이나 form을 렌더링하는 부모에서 호출하면 실제 제출 상태가 아니라 기본값을 받게 돼.
prop drilling 없이 제출 버튼 만들기
이 훅이 없으면 부모가 isPending을 읽어 SubmitButton에 prop으로 내려줘야 해. useFormStatus를 쓰면 버튼이 자기가 속한 form의 상태를 직접 읽으므로 다른 form으로 옮겨도 연결이 유지돼.
제출 중인 데이터 보기
data에는 진행 중인 제출의 FormData가 들어 있어. 저장 중인 제목을 미리 보여 주는 것처럼 제출 내용을 낙관적으로 표시할 수 있고, 다음 레슨의 useOptimistic와 자연스럽게 이어져.
현재 form의 제출 정보를 읽어
useFormStatus는 pending뿐 아니라 제출 중인 FormData와 method, action 정보를 제공해. 그래서 재사용 SubmitButton이 prop 없이 현재 form을 disable하고, 별도 PendingPreview가 지금 제출하는 값을 보여 줄 수 있어.
반드시 form의 자식에서 호출해
훅을 호출하는 컴포넌트가 form 바깥에 있거나 같은 컴포넌트가 만든 form보다 위에 있으면 그 제출 상태를 읽지 못해. 함수 Action이 아닌 문자열 action을 쓰는 네이티브 form에서도 React Action lifecycle이 없으므로 기본 상태만 돌아와.