React

[React] React Hook Form 사용한 Validation(검증) 처리 방법

cob 2022. 9. 6. 09:00
리액트에서  Input Validation, Form Submit 등 작업을 하기 좋은 방법이다.
보통 Form의 검증이 많거나, 많은 Input을 가질 때 사용한다.

 

 

1. 라이브러리 설치

npm install react-hook-form

 

 

 


2. React Hook Form 사용하지 않을 경우

// state
const [name, setName] = useState("");
const [phone, setPhone] = useState("");
const [email, setEamil] = useState("");
const [id, setId] = useState("");

// 검증
const [nmErr, setNmErr] = useState("");
... 반복

const onSubmit = (event: React.FormEvent<HTMLFormElement>) => {
    event.preventDefault();
    if(name.lenth < 10) {		
        return setNmErr("name error")
    }
    ... 반복
};


const onChange = (event: React.FormEvent<HTMLInputElement>) => {
    const {
      currentTarget: { value },
    } = event;
    setNmErr(""); // 초기화
  };
  • 위와 같이 많은 검증useState가 필요하다.

 

 

 


3. 사용 방법

3-1) register 함수

onChange(이벤트 핸들러), setState 기능을 한다.

 

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


function ToDoList() {
    const { register } = useForm();
    console.log(register);

    return (
        <div>
          <form>
            /* 'name'이라는 register 생성  */
            <input {...register("name")} placeholder="name" />
          </form>
        </div>
  );
}
export default ToDoList;

register

  • {...register("name")} 
    - ES6 문법, register 함수가 반환하는 객체를 input에 prop으로 준다.(병합)
  • onBlur : input 태그 밖을 클릭하여 focus가 없어졌을 때 이벤트
  • onClick : input 태그 클릭 했을 때 이벤트
  • onChange : input 태그 value를 변경 했을 때 이벤트

 

3-2) watch 함수

Form의 입력값들의 변화를 관찰 할 수 있다.

 

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


function ToDoList() {
	const { register, watch } = useForm();
	console.log(watch());
	return (
        <div>
          <form>
            <input {...register("name")} placeholder="name" />
            <input {...register("phone")} placeholder="phone" />
            <input {...register("email")} placeholder="email" />
          </form>
        </div>
  );
}
export default ToDoList;

watch

  • watch () : onChange 함수랑 같은 기능으로 값의 변화를 알려준다.

 

3-3) handleSubmit 함수

validation(검증)을 담당 한다.

 

...

function ToDoList() {
  const { register, handleSubmit, formState {errors} } = useForm<IFormData>();
  const onValid = (data: any) => {
  	/** 검증 조건 **/
    console.log(data);
  };

  return (
    <div>
      <form onSubmit={handleSubmit(onValid)}>
        <input {...register("name" ,{required:true})} placeholder="name" />
        <input {...register("phone",{required:true})} placeholder="phone" />
        <input {...register("email",{required:true})} placeholder="email" />
        <button>Add</button>
      </form>
    </div>
  );
}
export default ToDoList;

handleSubmit

  • handleSubmit 함수 
    - 첫번째 param : 데이터가 유효할 때 호출 (필수 조건)
    - 두번째 param : 데이터가 유효하지 않을 때 호출 (필수 조건 아님)
  • { required:true }
    - 필수 여부를 체크
    - Input 태그의 속성으로 주면 지원하지 않는 브라우저, 모바일 또는 소스코드를 임의로 수정시에  적용이 안될 수 있기 때문에 HTML에 의지하는 대신 자바스크립트에서 검증을 한다.
    - 자동으로 해당 커서를 에러가 있는 항목으로 옮겨 준다.

 

3-4) Input Validation

(Validation 기본 방법)

<input
{...register("id", {
  	required: "id is required",
  	validate: (value) =>
    	value.includes("nico") ? "no nico allowed" : true,
})}
  • validate : true / false를 리턴하며 validate체크 한다. 리턴 값이 문자열이면 에러 메세지를 리턴한다는 뜻이다.

 

(Validation 함수 방법)

validate: {
      noNico: (value) =>
        value.includes("nico") ? "no nico allowed" : true,
      /* 비동기는 async */  
      noNick: async(value) =>
        value.includes("nick") ? "no nick allowed" : true,
    },
  • 여러개의 검증 조건을 사용하기 위해 함수로 작성

 

 

 


4. Error Hadling


interface IForm {
  id: string;
  pwd1: string;
  pwd2: string;
  email?: string;
}

const { register, handleSubmit, formState {errors} } = useForm<IForm>();

...생략

<input
  {...register("Phone ", {
    required: "Phone is required",
    minLength: { value: 5, message: "Your phone is too short." },
  })}
  placeholder="phone"
/>

<input
    {...register("email", {
      required: true,
      pattern: {
        value: /^[A-Za-z09.%+-]+@naver.com$/,
        message: "Only naver.com",
      },
    })}
    placeholder="email"
  />
<span>{errors?.email?.message}</span>

오류 발생

  • formState.errors register의 오류 내용이 담겨 있다.
  • required : "name is required" ⇒ 오류 메세지로 출력
  • minLength {value : 5, message: "" }
    - value : 최소 길이 검증
    - mssage: 해당 오류 메세지 
  • pattern : 정규 표현식을 이용한 형식 정하기
    - value : 정규표현식에 맞게 검증
    - message : 해당 오류 메세지
  • {errors?.email?.message}
    - email 오류 발새시 해당 메세지 출력, 없을 경우를 대비해 ?를 붙인다.

 

4-1)  setError (특정 오류 발생)

interface IForm {
  id: string;
  pwd1: string;
  pwd2: string;
  email?: string;
}

function ToDoList() {
  const {
    register,
    handleSubmit,
    formState: { errors },
    setError,
  } = useForm<IForm>({ defaultValues: { email: "@naver.com" } });

  const onValid = (data: IForm) => {
    if (data.pwd1 !== data.pwd2) {
      /* 특정 오류 */
      setError("pwd1", { message: "패스워드가 다릅니다." },{ shouldFocus: true });
    }
  };
return (
    <form onSubmit={handleSubmit(onValid)}>
        ...
    </from>
 )
}
  • setError 함수 : 특정한 오류를 발생시켜 준다.
  • onValid 내부에 특정 오류 정의 
  • interface에 있는 오류만 발생시키기 때문에 특정 오류를 발생 시키고 싶으면 새롭게 추가한다.
  • shouldFocus : 오류 발생시 강제 focus
반응형