본문 바로가기

Library

React Hook Form

React Hook Form

  • React 애플리케이션에서 폼을 효율적으로 관리할 수 있게 해주는 라이브러리
  • 성능이 좋고, 유연하며, 적은 코드로 복잡한 폼을 구현할 수 있음

 

주요 특징

성능 최적화

  • 필요한 리렌더링 방지 (Uncontrolled components를 사용하여 입력값 변경 시 전체 폼이 리렌더링되지 않음)
  • 의존성 없음, 매우 가벼운 용량

쉬운 폼 검증

  • 내장된 유효성 검사 기능을 제공
  • Yup, Zod 등의 외부 검증 라이브러리와 통합이 가능

적은 코드량

  • 보일러플레이트 코드를 줄여줌
  • 직관적인 API를 제공

 

 

주요 Hook과 메서드, 옵션

import { useForm } from "react-hook-form";

const {
  register,
  handleSubmit,
  formState: { errors },
  watch,
  setValue, // 개별 필드의 값을 변경
  reset     // 폼 전체의 값을 초기화
} = useForm({
  defaultValues: {
    email: '',
    password: ''
  },
  mode: 'onSubmit'
});

 

1. useForm

  • 의 상태와 메서드를 제공하는 핵심 훅
  • register, handleSubmit, formState 등의 메서드를 제공

2. register

<input {...register("email", {
  required: "이메일은 필수입니다",
  pattern: {
    value: /^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}$/i,
    message: "올바른 이메일 형식이 아닙니다"
  }
})} />
  • 필드를 등록하는 함수
  • 유효성 검사 규칙 설정
  • 필드의 참조를 관리

3. handleSubmit

const onSubmit = (data) => console.log(data);
<form onSubmit={handleSubmit(onSubmit)}>
  • 제출을 처리하는 함수
  • 유효성 검사 통과 시 데이터 처리
  • 실패 시 에러 처리

4. formState

const { 
  isDirty,      // 폼이 수정되었는지
  isSubmitting, // 제출 중인지
  errors,      // 유효성 검사 에러(메세지 포함)
  isValid      // 모든 유효성 검사 통과 여부
} = formState;

// 사용
const { isDirty, isValid } = formState;
return <button disabled={!isDirty || !isValid} />;
  • 폼의 상태 정보를 담고 있음

5. watch

const { register, watch } = useForm();
const hasPhone = watch("hasPhone");

return (
  <>
    <input type="checkbox" {...register("hasPhone")} />
    {hasPhone && (
      <input {...register("phoneNumber", {
        required: "전화번호는 필수입니다"
      })} />
    )}
  </>
);
  • 폼 필드의 값을 실시간으로 관찰

6. setValue

setValue('email', 'hayoung@naver.com');
  • 개별 필드의 값을 변경할 때 사용

7. reset

  • 전체의 값을 초기화할 때 사용
  • 입력 값, 오류, 더티 필드, 터치된 필드 등 모든 상태 초기화

8. defaultValues

  • 폼의 초기값을 설정하는 옵션
  • 동기식 및 비동기식 할당 모두 지원
  • 캐시되며, 재설정하려면 reset API 사용 필요
  • 기본적으로 제출 결과에 포함되며 undefined 기본값 설정은 피하기

9. mode 옵션

  • OnBlur : 입력 필드가 포커스를 잃을 때 검증
  • onChange : 입력값 변경 시 즉시 검증 (다수의 리렌더링이 발생할 수 있어 성능에 영향을 줄 수 있음)
  • onSubmit : 폼 제출 시에만 검증
  • all : 모든 이벤트에서 검증

 

react-hook-form 사용하기

1. 설치

// npm
npm install react-hook-form
// yarn
yarn add react-hook-form

 

2. 기본 설정

import { useForm } from 'react-hook-form';

function MyForm() {
  const { register, handleSubmit, formState: { errors } } = useForm();
}

 

3. 폼 필드 등록

<form onSubmit={handleSubmit(onSubmit)}>
  <input {...register("username", {
    required: "사용자 이름은 필수입니다",
    minLength: {
      value: 2,
      message: "2글자 이상 입력해주세요"
    }
  })} />
  {errors.username && <p>{errors.username.message}</p>}
</form>

 

4. 제출 처리

const onSubmit = async (data) => {
  try {
    await submitAPI(data);
    reset(); // 폼 초기화
  } catch (error) {
    console.error(error);
  }
};

 

 

Zod 와 통합하기

1. resolvers 설치

npm install @hookform/resolvers zod
yarn add @hookform/resolvers zod

 

2. 스키마 정의 후 useForm 설정

import { zodResolver } from '@hookform/resolvers/zod';
import * as z from 'zod';

const schema = z.object({
  email: z.string().email(),
  password: z.string().min(8)
});

const { register, handleSubmit } = useForm({
  resolver: zodResolver(schema)
});

 

3. 폼 구현

 

'Library' 카테고리의 다른 글

Zod  (0) 2025.01.21