티스토리 뷰

react

Simple form validation with React Hook Form 에 관한 글

YG - 96년생 , 강아지 있음, 개발자 희망 2021. 12. 3. 03:13

설치법

npm install react-hook-form

React Hook Form 을 쓰는 것이 좋은 이유

function ToDolist() {
  const [toDo, setToDo] = useState("");
  const onChange = (event: React.FormEvent<HTMLInputElement>) => {
    //console.log(event.currentTarget.value);
    const { value } = event.currentTarget;
    setToDo(value);
  };
  const onSubmit = (event: React.FormEvent<HTMLFormElement>) => {
    event.preventDefault();
    console.log(toDo);
    setToDo("");
  };
  return (
    <div>
      <form onSubmit={onSubmit}>
        <input
          onChange={onChange}
          value={toDo}
          type="text"
          placeholder="write your todo"
        />
        <button>Add</button>
      </form>
    </div>
  );
}

이렇게 기존의 방식처럼 하나의 인풋과 폼에 설정해야하는 state가 많고 만약 아이디 비밀번호 주소 닉네임 이름 등 여러개의 input이 필요한 경우에 위의 방법으로 하기에는 만만하지 않은 코드의 양이 필요할 것입니다.

 

그래서 React Hook Form이 나오게 되었습니다.

 

사용법

 

1. import 해주기

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

 

2. useForm() 사용해주기

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

 

2-1. input에 register 사용

 

        <input {...register("password")} placeholder="Password" type="text" />

input {...register("원하는 내용")} 을 설정해주면 기존의 useState 를 사용하는 것과 같이 password 라는 key 값에 value가 저장됩니다.

 

2-2 register에 다양한 옵션 부여 가능

<input
          {...register("email", {
            required: "Email is required",
            pattern: {
              value: /^[A-Za-z0-9+-.%_]+@naver.com/,
              message: "Only naver.com emails allowed",
            },
            minLength: 5,
          })}
          placeholder="Email"
        />

{... register("원하는key값" , { required : true( true 대신에 문자열을 적어 에러내용을 적을 수 있습니다) ,

pattern:{

value: 원하는 값( 예를들어 naver.com 이메일만 받고 싶다 싶으면 pattern의 value 값에 저장하여 원하는 값만 받을 수 있습니다.)

,massage : 원하는 값을 안넣고 사용자가 잘못 입력하였을 때 에러 메세지 출력할 값을 저장할 수 있습니다.

},minLength :5 혹은 minLength:{

value: 5,

message:오류가 났을 때 메세지 출력할 값 저장

} 으로 사용할 수 있습니다.

})}

 

minLength, maxLength 등 Html input 값에 설정할 수 있지만 사용자 입장에서 코드소스를 변경하여 제출할 수도 있으므로 register 안에 넣는 것이 안전합니다.

 

2-3 regiset에 원하는 값을 받을 수 있는  validate(입증하다) 를 설정할 수 있습니다.

<input
          {...register("firstName", {
            required: "write here",
            validate: {
              noNico: (value) =>
                value.includes("asdf") ? "no asdf allowed" : true,
              noNick: (value) =>
                value.includes("zxcv") ? "no zxcv allowed" : true,
            },
          })}
          placeholder="First Name"
        />

{...register("key" , { validate :{

이름 : value => true or false 로 결과가 나오는 값 을 설정함으로써 부적절한 값을 넣을 경우 에러메세지를 출력할 수 있습니다.

}}

 

3.Form 에 handelSubmit 함수 사용하기

<form
        onSubmit={handleSubmit(onVaild)}
      >

 

3-1 Form 에 들어올 interface type값 알려주기 , 또한 default 값 설정이 가능합니다.

interface IForm {
  email: string;
  nickName: string;
  password: string;
  password1: string;
}

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

 

 

3-2 handleSubmit에는 onVaild 의 기능을 하는 함수가 필요합니다. 

const onValid = (data: IForm) => {
    if (data.password !== data.password1) {
      setError(
        "password1",
        { message: "Password are not the same" },
        { shouldFocus: true }
      );
    }
    // setError("extraError", { message: "Server offline." });
  };

이런 함수 값으로 password 입증이 틀렸다고 setError("key값", {message : 오류메세지 저장}, {shouldFocus : true( 틀린곳에 자동으로 포커스 기능을 할것인지) })을 통해 도움을 받을 수 있습니다.

 

또한 setError()을 통해 서버가 오프라인 되었을 경우 전역 오류 메세지를 출력할 수도 있습니다.

 

3-3 setValue 를 이용하여 key 값의 value를 변경할 수 있습니다.

  const { register, handleSubmit, setValue } = useForm<IForm>();
  const handleVaild = (data: IForm) => {
    console.log("add to do", data.toDo);
    setValue("toDo", "");
  };

setValue("key값", 변경하고자 하는 내용) 을 활용할 수 있습니다

 

4. errors 활용하여 에러 메세지 출력하기

  const {
    register,
    watch,
    handleSubmit,
    formState: { errors },
  } = useForm<IForm>({ defaultValues: { email: "@naver.com" } });
  
<span>{errors.email?.message}</span>

errors.email?.message 를 통해 위의 formState : {errors} 를 통해 erorrs라는 변수를 설정한 것을 활용할 수 있습니다.

 

주의할 점은 errors? 혹은 errors.email? 에 ?를 붙혀줘야 에러가 없을 때 타입스크립트가 문제를 일으키지 않습니다.

 

5. watch() 를 통해 어떻게 submit 과 value 저장이 진행되는지 확인할 수 있습니다.

  console.log(watch());

 

 

https://react-hook-form.com/get-started

 

Get Started

Performant, flexible and extensible forms with easy-to-use validation.

react-hook-form.com

 

느낀 점

 

react hook form 은 정말 form 문을 리액트로 이용할 때 없어서는 안될 좋은 라이브러리인 것 같습니다.

 

만약 onSumbit onChange useState 등으로 회원가입 form 을 만든다고 하였을 때 작업속도에 차이가 확연히 날 것 같습니다.

'react' 카테고리의 다른 글

React Query 에 대한 글  (0) 2021.12.10
Recoil 에서 Selector 기능 get, set 사용법  (0) 2021.12.04
use State Management 를 해주는 Recoil에 관한 글  (0) 2021.12.02
TypeScript + React  (0) 2021.11.25
React styled-components  (0) 2021.11.24
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함