React-Hook_Form

2025. 2. 16. 16:26·React🦄

React-Hook-Form (비제어 컴포넌트)

React 기반의 폼 관리 라이브러리로, 폼 상태 유효성 검사를 처리 방법

폼 요소의 값이나 상태 변경에 대한 이벤트를 관리하기 위해 이벤트 핸들러를 작성 할 필요 없이, hook(useForm,useController,useWatch..)을 사용해서 관련 데이터를 추적 및 업데이트를 할 수 있다.

장점

  1. 간결한 API
    직관적인 API를 제공 폼 로직 단순화
  2. 높은 성능
    입력 필드값의 변화를 추적해서 "상태" 대신 참조(reference)를 사용해서 불필요한 리렌더링을 방지한다.
  3. 유효성 검사
    React-Hook_Form 내장 유효성 검사를 지원하며, Yup,Joi등의 외부 라이브러리와 통합 가능, 검사를 수행하고 에러 메세지를 표시할 수 있습니다.

주요개념

  1. useForm
    React-Hook-Form의 핵심 함수, form 의 인스턴스를 생성하고 데이터와 메서드를 제공

  2. register
    register 함수는 입력 필드를 React-Hook-Form 의 등록. 입력 필드에 대한 유효성 검사 규칙, 기본값 등을 설정

  3. handleSubmit
    submit 함수 제출 시 실행할 함수를 정의, 이 함수는 유효성 검사를 수행하고, 데이터를 처리하는 로직을 작성할 수 있다.

  4. error

mode,defaultValues

mode는 동작모드 설정 및 유효성 검사 방법을 지정

  • onBlur(default) : 입력 필드가 포커스를 잃을 때 수행
  • onChange : 입력 필드의 값이 변경될 때마다 유효성 검사 수행
  • onSubmit : 폼 제출시에 유효성 검사
const { register, handleSubmit, setValue } = useForm({
  mode: "onChange",
  defaultValues: {
    fieldName1: "Default Value 1",
    fieldName2: "Default Value 2",
  },
});

resolver

비동기 유효성 검사를 수행하기 위해 사용

  • resolver 는 폼 제출 시 실행되는 함수를 정의, 입력테이터를 인자로 받아서 비동기적으로 유효성 검사
  • yupResolver를 이용해서 input 값들을 서버로 보내기전에 검증하는 과정을 거침
  • schema 를 정의해서 스키마를 기반으로 정보 검증
  • shape 속성을 사용해서 객체의 대한 검사 조건 설정
import React from "react";
import { useForm, Controller } from "react-hook-form";
import * as yup from "yup";

// Yup 스키마 정의
const schema = yup.object().shape({
  firstName: yup.string().required("First name is required"),
  lastName: yup.string().required("Last name is required"),
  email: yup
    .string()
    .email("Invalid email address")
    .required("Email is required"),
});

function MyForm() {
  const { control, handleSubmit, errors } = useForm({
    resolver: yupResolver(schema), // Yup Resolver를 사용하여 유효성 검사를 설정합니다.
  });

  const onSubmit = (data) => {
    // 유효성 검사를 통과한 데이터를 처리합니다.
    schema
      .validate(data)
      .then(() => {})
      .catch((error) => {});
  };
}

register

react-hook-form 에 입력요소를 등록하는데 사용됨.

  • register 하는 과정을 통해 해당 input 값을 제어하고, 값을 수집, 유효성 검사를 실행(함수형태)
  • params는 name 으로 해당 필드의 key값
  • optional dms 유효성 검사를 위한 프로퍼티들을 넣을 수 있슴
<input
  type="text"
  {...register("email", {
    pattern: {
      value:
        /^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$/i,
      message: "이메일 형식에 맞지 않습니다.",
    },
  })}
/>

register 와 Controller 비교

편의성, 유연성, 성능 면에서의 비교

  1. Controller의 편의성:

외부 라이브러리와의 연동이 간편하며, 컴포넌트 간의 상태를 쉽게 전달할 수 있습니다.

  1. Register의 편의성:

직접적인 등록으로 렌더링 효율이 높습니다.

  1. 둘의 유연성:

Controller는 외부 라이브러리와의 통합에 유리하나, 사용자 정의 요소에 적용하기 어렵습니다.
Register는 직접적인 등록으로 자유도가 높으며, 사용자 정의 요소에 적용 가능합니다.

  1. 성능 면에서의 차이:

큰 규모의 폼이나 동적인 상황에서 Controller는 렌더링 성능에 유리할 수 있습니다.
작은 규모의 폼에서는 Register가 직접적으로 등록되어 렌더링 성능이 우수할 수 있습니다.

Controller

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

const MyForm = () => {
  const { control, handleSubmit } = useForm();

  const onSubmit = (data) => {
    // 폼 제출 처리...
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      {/* Controller 함수를 사용하여 입력 요소 등록 */}
      <Controller
        name="username"
        control={control}
        render={({ field }) => <input {...field} />}
      />

      {/* 나머지 폼 요소들... */}
    </form>
  );
};

register

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

const MyForm = () => {
  const { register, handleSubmit } = useForm();

  const onSubmit = (data) => {
    // 폼 제출 처리...
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      {/* Register 함수를 사용하여 입력 요소 직접 등록 */}
      <input {...register("username")} />

      {/* 나머지 폼 요소들... */}
    </form>
  );
};

'React🦄' 카테고리의 다른 글

Recoil  (0) 2025.02.19
SVG파일, Component 사용하기!(for Vite + TypeScript)  (0) 2025.02.03
useRef는 뭘까아요~~~?  (0) 2025.01.24
'React🦄' 카테고리의 다른 글
  • Recoil
  • SVG파일, Component 사용하기!(for Vite + TypeScript)
  • useRef는 뭘까아요~~~?
나미쓰
나미쓰
409....Conflict
  • 나미쓰
    나미의 기록📝
    나미쓰
  • 전체
    오늘
    어제
    • 분류 전체보기 (15)
      • 웹 접근성 (0)
      • JS (5)
      • 일상 (0)
      • Typescript (4)
      • React🦄 (4)
      • PHP (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • coding
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    contructor
    타입스크립트
    코딩공부
    union type
    javascript class
    intersection type
    생성자함수
    tsconfig
    lalavel
    Await
    restapi
    php
    svgr
    JavaScript
    javascript 생성자
    비동기 함수
    image component
    typescript class
    optional chaining
    axios
    API
    es6
    비동기통신
    Iterable
    Vite
    watch mode
    TypeScript
    PROMISE
    학습블로깅
    react-hook-form
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.4
나미쓰
React-Hook_Form
상단으로

티스토리툴바