React Hook Form은 React 애플리케이션에서 폼을 다루는 데 도움이 되는 라이브러리 중 하나입니다.
이를 통해 폼 컴포넌트의 개발과 유지 보수를 용이하게 할 수 있습니다.
React-hook-form 을 사용하면 form component 의 상태 및 유효성 검사를 관리하는데 필요한 코드 양을 대폭 줄일 수 있습니다. 저도 평소에 form 기능을 만들때 input 을 useState 로 관리하고 필요에 따라 명시적인 이벤트 핸들러를 작성하는데 React-hook-form 은 제공해주는 Hook 을 사용하여 관련 데이터를 추적하고 업데이트 할 수 있습니다.
장점
간결한 API
React Hook Form은 사용하기 쉽고 직관적인 API를 제공하여 복잡한 폼 로직을 단순화합니다. 기본적으로 제공하는 Hook 함수들과 컴포넌트들을 사용하여 폼을 쉽게 생성하고 관리할 수 있습니다.
높은 성능
React Hook Form은 성능에 중점을 두어 최적화되어 있습니다. 입력 필드의 값 변화를 추적하는 "상태" 대신 각 입력 필드의 참조(reference)를 사용하여 불필요한 리렌더링을 방지하고, 가상 DOM의 업데이트를 최소화합니다.
유효성 검사
React Hook Form은 내장된 유효성 검사를 지원하며, 입력 필드의 값에 대한 유효성 검사를 수행하고, 에러 메시지를 표시할 수 있습니다.
그 외에도 리렌더링 방지와 렌더링 성능 최적화라는 큰 장점을 가지고 있습니다.
설치 및 실행
yarn add react-hook-form
npm install react-hook-form
기본 코드
import { useForm, SubmitHandler } from "react-hook-form";
interface UserInput {
name: string;
password: string;
}
const ReactHookForm = () => {
const {register, handleSubmit} = useForm<UserInput>();
const onSubmit: SubmitHandler<UserInput> = (data) => {
console.log(data);
// data = {name: "chan", password: "1234"}
}
return (
<div>
<form onSubmit={handleSubmit(onSubmit)}>
<label htmlFor="username">Username</label>
<input {...register("name")} id="username" />
<label htmlFor="password">Password</label>
<input {...register("password")} id="password" />
<input type="submit" />
</form>
</div>
)
}
export default ReactHookForm
위에 코드의 기본적인 작동 방식은 register 은 react-hook-form 의 input 을 등록합니다.
그리고 form 을 제출할 때 useForm 에서 꺼낸 handleSubmit 을 react-hook-form 에서 꺼낸 SubmitHandler 로 만든 함수를 넣어줍니다.
유효성 검사 options
required - 필수적으로 입력해야 하는 input 을 설정합니다.
min - 입력값의 최소값을 설정합니다.
max - 입력값의 최대값을 설정합니다.
minLength - 입력값의 최소 길이를 설정합니다.
maxLength - 입력값의 최대 길이를 설정합니다.
pattern - 일반적으로 정규 표현식을 쓰며 input 내용의 쓰는 방식을 설정합니다.
import { useForm, SubmitHandler } from "react-hook-form";
interface UserInput {
name: string;
password: string;
age: number;
}
const ReactHookForm = () => {
const {register, handleSubmit} = useForm<UserInput>();
const onSubmit: SubmitHandler<UserInput> = (data) => {
console.log(data);
}
return (
<div>
<form onSubmit={handleSubmit(onSubmit)}>
<label htmlFor="username">Username</label>
<input {...register("name", { required: true, maxLength: 9 })} type="text" id="username" />
<label htmlFor="password">Password</label>
<input {...register("password", { required: true, pattern: /* 정규 표현식 쓰기*/})} type="password" id="password" />
<label htmlFor="age">Age</label>
<input {...register("age", {required: true, min:19, max: 65 })} type="text" />
<input type="submit" />
</form>
</div>
)
}
export default ReactHookForm
errors
React-hook-form 에서 지원하는 errors 는 유효성 검사에서 규칙에 어긋나는 상황이 발견된다면
쓸 수 있는 유용한 기능 입니다.
import { useForm, SubmitHandler } from "react-hook-form";
interface UserInput {
name: string;
password: string;
age: number;
}
const ReactHookForm = () => {
const {register, handleSubmit, formState: {errors} } = useForm<UserInput>();
const onSubmit: SubmitHandler<UserInput> = (data) => {
console.log(data);
}
return (
<div>
<form onSubmit={handleSubmit(onSubmit)}>
<label htmlFor="username">Username</label>
<input {...register("name", { required: true, maxLength: 9 })} type="text" id="username" />
{errors.name?.type === "required" && (<div>이름을 입력해 주세요.</div>)}
{/* errors.name && errors.name.type === "required" */}
<label htmlFor="password">Password</label>
<input {...register("password", { required: true, pattern: /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/})} type="password" id="password" />
{errors.password?.type === "pattern" && (<div>규칙에 맞게 패스워드를 입력해 주세요.</div>)}
<label htmlFor="age">Age</label>
<input {...register("age", {required: true, min:19, max: 65 })} type="text" />
{errors.age?.type === "min" && (<div>최소 19 ~ 65 이하로 입력해 주세요.</div>)}
<input type="submit" />
</form>
</div>
)
}
export default ReactHookForm
'라이브러리' 카테고리의 다른 글
Jotai (1) | 2024.08.24 |
---|---|
React Intersection Observer (0) | 2024.08.20 |
browser-image-compression (0) | 2024.07.15 |
React 에서 emtion 사용하기 (0) | 2024.07.09 |
React 에서 gsap 사용하기 (0) | 2024.07.03 |