React Hook Fromμ΄λž€?πŸ‘€

React Hook Form은 React 기반의 폼 관리 라이브러리 쀑 ν•˜λ‚˜λ‘œ ReactHooksλ₯Ό μ‚¬μš©ν•˜μ—¬ 폼을 μ‰½κ²Œ κ΄€λ¦¬ν•˜κ³  μœ νš¨μ„± 검사λ₯Ό μˆ˜ν–‰ν•  수 μžˆλ„λ‘ 도와쀀닀.

μž₯μ μœΌλ‘œλŠ” μš”λž˜ μžˆλŠ”λ°

  • 적은 μ–‘μ˜ μ½”λ“œλ‘œλ„ 더 λ‚˜μ€ μ„±λŠ₯을 얻을 수 μžˆλ‹€.
  • λΆˆν•„μš”ν•œ λ¦¬λ Œλ”λ§μ„ μ΅œμ†Œν™”ν•˜μ—¬ μ„±λŠ₯을 ν–₯μƒμ‹œν‚¬ 수 μžˆλ‹€.
  • TypeScriptλ₯Ό 기본으둜 μ§€μ›ν•œλ‹€.
  • λ‘œλ”© 속도가 빠릇빠릇 ν•˜λ‹€.

(λ‹Ήμ—°νžˆ μ•Œκ³  μžˆκ² μ§€λ§Œ γ…Ž;) 폼(Form)은 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‚¬μš©μžλ‘œλΆ€ν„° 데이터λ₯Ό μž…λ ₯λ°›λŠ” μš”μ†Œλ₯Ό μ˜λ―Έν•œλ‹€.
ex)input, button, checkbox, drop-down ...

Reactμ—μ„œλŠ” μ΄λŸ¬ν•œ 폼을 λ§Œλ“€κ³  κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ μƒνƒœ(State)와 이벀트 처리λ₯Ό ν™œμš©ν•˜λŠ”λ°, μ΄λ•Œ React Hook Formκ³Ό 같은 라이브러리λ₯Ό μ‚¬μš©ν•˜λ©΄ νŽΈλ¦¬ν•˜κ²Œ μƒνƒœ 및 이벀트 처리λ₯Ό 관리할 수 μžˆλ‹€.

react 일반 폼

λ¦¬μ•‘νŠΈμ—μ„œ 일반 폼을 μž‘μ„±ν•˜λŠ” 과정은 κ½€ λ³΅μž‘ν•  수 μžˆλ‹€.
각 input 값에 λŒ€ν•œ μƒνƒœ 관리와 onChange 이벀트 처리λ₯Ό ν•΄μ•Όν•˜λ©°, submitμ—λŠ” λ‹€μ–‘ν•œ μœ νš¨μ„± 검사 μ½”λ“œλ₯Ό μž‘μ„±ν•΄μ•Ό ν•œλ‹€. μ‚¬μš©μžκ°€ ν•„μˆ˜ 사항을 μ˜¬λ°”λ₯΄κ²Œ μž…λ ₯ν–ˆλŠ”μ§€, 양식에 맞게 μž‘μ„±ν–ˆλŠ”μ§€ 등을 확인해야 ν•œλ‹€...
λ˜ν•œ, μœ νš¨μ„± 검사에 μ‹€νŒ¨ν–ˆμ„ λ•Œ 보여쀄 μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό κ΄€λ¦¬ν•˜λŠ” μƒνƒœλ„ ν•„μš”ν•˜λ‹€. 이 λͺ¨λ“  과정을 κ±°μ³μ•Όλ§Œ μ‚¬μš©μž κ²½ν—˜μ„ λ§Œμ‘±μ‹œν‚€λŠ” 폼을 λ§Œλ“€ 수 μžˆλ‹€.

μ•„λž˜λŠ” λ¦¬μ•‘νŠΈμ—μ„œ κ°„λ‹¨ν•œ 이메일과 λΉ„λ°€λ²ˆν˜Έλ₯Ό μž…λ ₯λ°›λŠ” 폼을 μž‘μ„±ν•œ μ˜ˆμ‹œμ΄λ‹€.

import React, { useState } from "react";

export default function Forms() {
  const [email, setEmail] = useState("");
  const [password, setPassword] = useState("");
  const [emailError, setEmailError] = useState("");
  const [passwordError, setPasswordError] = useState("");
  const [formError, setFormError] = useState("");

  const handleEmailChange = (e) => {
    const { value } = e.currentTarget;
    setEmail(value);
    setEmailError("");
    setFormError("");
  };

  const handlePasswordChange = (e) => {
    const { value } = e.currentTarget;
    setPassword(value);
    setPasswordError("");
    setFormError("");
  };

  const handleSubmit = (e) => {
    e.preventDefault();

    if (!email || !password) {
      setFormError("이메일과 λΉ„λ°€λ²ˆν˜ΈλŠ” ν•„μˆ˜ μž…λ ₯ μ‚¬ν•­μž…λ‹ˆλ‹€.");
    } else {
      if (!email.includes("@")) {
        setEmailError("μœ νš¨ν•œ 이메일 μ£Όμ†Œλ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.");
      }
      if (password.length < 8) {
        setPasswordError("λΉ„λ°€λ²ˆν˜ΈλŠ” μ΅œμ†Œ 8자 이상이어야 ν•©λ‹ˆλ‹€.");
      }
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="email"
        placeholder="이메일"
        value={email}
        onChange={handleEmailChange}
        required
      />
      {emailError && <div>{emailError}</div>}
      
      <input
        type="password"
        placeholder="λΉ„λ°€λ²ˆν˜Έ"
        value={password}
        onChange={handlePasswordChange}
        required
      />
      {passwordError && <div>{passwordError}</div>}
      
      <button type="submit">계정 생성</button>
      {formError && <div>{formError}</div>}
    </form>
  );
}

이 μ˜ˆμ‹œ μ½”λ“œλŠ” κ°„λ‹¨ν•œ 이메일과 λΉ„λ°€λ²ˆν˜Έ μž…λ ₯ 폼을 κ΅¬ν˜„ν•œ 것 인데 ν•„μš”μ— 따라 CSSλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ λ‹€λ₯Έ μœ νš¨μ„± 검사 좔가적인 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λ©΄ μ½”λ“œκ°€ λ”μš± κΈΈκ³  λ³΅μž‘ν•΄μ§ˆ 수 μžˆλ‹€πŸ˜₯😱

ν•˜μ§€λ§Œ μš”λŸ° κ·€μ°¨λ‹ˆμ¦˜μ„ ν•΄κ²°ν•  react hook from을 μ‚¬μš©ν•΄λ³΄μž!πŸ˜†

Get Start~!πŸ’₯

μš°μ„  제일 μ€‘μš”ν•œ react hook from 라이브러리λ₯Ό μ„€μΉ˜ν•œλ‹€.

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

1.폼 생성

μš°μ„  기본적으둜 React Hook Form을 μ‚¬μš©ν•˜λ €λ©΄ useForm 훅을 μ‚¬μš©ν•˜μ—¬ 폼을 생성해야 ν•œλ‹€.

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

export default function Forms() {
	const { register } = useForm();
  return (
    <form>
      <input
    	{...register("email")}
        type="email"
        placeholder="Email"
        required
      />
      <input
		{...register("password")}
        type="password"
        placeholder="Password"
        required
      />
      <input type="submit" value="Create Account" />
    </form>
  );
}

μ΄λ ‡κ²Œ ν•˜λ©΄ μœ„μ— 일반 폼과 λΉ„κ΅ν•˜λ©΄ useFrom을 μ΄μš©ν•˜μ—¬ 맀우 κΈΈμ—ˆλ˜ state μ½”λ“œλ₯Ό 쀄일 수 μžˆλ‹€.πŸ˜‹

λ‹€μ‹œ λŒμ•„μ™€ λ‹€λ₯Έ ν•¨μˆ˜λ„ μ•Œμ•„λ³Όκ²Έ 또 λ‹€λ₯Έ μ˜ˆμ‹œ μ½”λ“œλ₯Ό μ‚΄νŽ΄λ³΄λ©΄

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

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

  const onSubmit = (data) => {
    console.log(data); // 제좜된 폼 데이터 좜λ ₯
  };

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      {/* 각 μž…λ ₯ ν•„λ“œμ— register ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ—°κ²° */}
      <input {...register('firstName', { required: '이 ν•„λ“œλŠ” ν•„μˆ˜μž…λ‹ˆλ‹€.' })} />
      {errors.firstName && <p>{errors.firstName.message}</p>}

      <input {...register('lastName')} />

      <button type="submit">제좜</button>
    </form>
  );
}

2.μž…λ ₯ ν•„λ“œμ— register ν•¨μˆ˜ 적용

μœ„μ— μ‚¬μš©λœ register ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 각 μž…λ ₯ ν•„λ“œλ₯Ό 폼과 μ—°κ²°ν•œλ‹€.

Register ν•¨μˆ˜λŠ” input의 값을 κ°€μ Έμ˜€κΈ° μœ„ν•œ ν•¨μˆ˜λ‘œ, λ‹€λ₯Έ μ˜΅μ…˜μ„ μ‚¬μš©ν•˜λ©΄ input의 μœ νš¨μ„± 검사도 κ°„νŽΈν•˜κ²Œ μˆ˜ν–‰ν•  수 μžˆλ‹€.
λ‹€μŒκ³Ό 같이 {...register('μ‚¬μš©ν•  이름', {'검증할 λ‚΄μš©'})} 이라고 적어주면 λ‚˜μ€‘μ— 적은 μ΄λ¦„μœΌλ‘œ 값을 뢈러올 수 μžˆλ‹€.

μ΄λ•Œ μž…λ ₯ ν•„λ“œμ˜ name 속성은 ν•΄λ‹Ή μž…λ ₯ ν•„λ“œμ˜ μ‹λ³„μž 역할을 ν•œλ‹€.


μ•„λž˜λŠ” 미리 μœ„μ— μ‚¬μš©λ˜λŠ” ν•¨μˆ˜λ“€μ„ μš”μ•½ν•΄ λ³΄μ•˜λ‹€.

  • register : νΌλ“€μ˜ μœ νš¨μ„±μ„ ν™•μΈν•˜λŠ” ν•¨μˆ˜
  • handleSubmit : 폼을 μ œμΆœν•˜κΈ° μœ„ν•œ ν•¨μˆ˜
  • watch : μ‹€μ‹œκ°„μœΌλ‘œ μž…λ ₯폼에 적힌 값을 ν™•μΈν•˜λŠ” μ˜΅μ…˜
  • formState : 폼의 μƒνƒœ 정보λ₯Ό λ‹΄κ³  있음.
    (주둜 μœ νš¨μ„± 검사 μ—λŸ¬, 폼 전솑 μ—¬λΆ€, μž…λ ₯κ°’ 등을 ν™•μΈν•˜λŠ” 데 μ‚¬μš©)

3.Submit 이벀트 처리

폼 Submit 이벀트λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ handleSubmit ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•œλ‹€. 이 ν•¨μˆ˜λŠ” Submit λ²„νŠΌμ΄ 클릭되면 폼 데이터λ₯Ό μˆ˜μ§‘ν•˜κ³  λ“±λ‘λœ onSubmit ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•œλ‹€.
μœ„ μ˜ˆμ œμ—μ„œλŠ” λ‹¨μˆœνžˆ 폼 데이터λ₯Ό μ½˜μ†”μ— 좜λ ₯ν•˜λ„λ‘ λ˜μ–΄ μžˆλ‹€.

4.μ—λŸ¬ 처리 및 μƒνƒœ 관리

React Hook Form은 formState 객체λ₯Ό 톡해 폼의 μƒνƒœλ₯Ό κ΄€λ¦¬ν•˜λŠ”λ° 이 κ°μ²΄μ—λŠ” λ‹€μ–‘ν•œ 속성이 ν¬ν•¨λ˜μ–΄ μžˆμ§€λ§Œ, 이번 μ˜ˆμ‹œμ—λŠ” errors 속성을 μ‚¬μš©ν•˜μ—¬ μœ νš¨μ„± 검사 μ—λŸ¬λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법을 μ•Œμ•„λ³΄μž.

μœ„ μ½”λ“œλ₯Ό 보면

{errors.firstName && <p>{errors.firstName.message}</p>}:

이 뢀뢄은 firstName ν•„λ“œμ— λŒ€ν•œ μ—λŸ¬κ°€ μžˆμ„ 경우 ν•΄λ‹Ή μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ μ‚¬μš©μžμ—κ²Œ μœ νš¨μ„± 검사 μ‹€νŒ¨μ— λŒ€ν•œ 정보λ₯Ό μ œκ³΅ν•  수 μžˆλ‹€.μ΄λ ‡κ²Œ μœ νš¨μ„± 검사 μ—λŸ¬λ₯Ό μ²˜λ¦¬ν•˜κ³ , 각 ν•„λ“œμ— ν•΄λ‹Ήν•˜λŠ” μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•  수 μžˆλ‹€.

참고둜 λ§¨μœ„μ— 일반 폼에 μ‚¬μš©λœ 이메일, λΉ„λ°€λ²ˆν˜Έ μž…λ ₯폼은

<input
    {...register('password', {
      required: 'λΉ„λ°€λ²ˆν˜Έλ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.',
      minLength: {
        value: 8,
        message: 'λΉ„λ°€λ²ˆν˜ΈλŠ” 8자 이상이어야 ν•©λ‹ˆλ‹€.'
      }
    })}
    type="password"
  />
  {errors.password && <p>{errors.password.message}</p>}

μš”λŸ°μ‹μœΌλ‘œ λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. κ·Έ 외에도 이메일 양식, λ‹‰λ„€μž„, 이름 λ“± μ—¬λŸ¬ μœ νš¨μ„± 검사 ν•˜λŠ”κ²Œ μžˆλŠ”λ° react hook from을 톡해 더 κ°€λ…μ„±μžˆκ²Œ μž‘μ„± ν•  수 μžˆλ‹€.

0개의 λŒ“κΈ€

κ΄€λ ¨ μ±„μš© 정보

Powered by GraphCDN, the GraphQL CDN