티스토리 뷰
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
느낀 점
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
- nextjs
- javascript
- createPortal
- 원티드
- NextRequest
- env
- 북클럽
- C언어
- CLASS
- 초보
- nodejs
- electron
- 우아한테크코스
- 프론트앤드
- 프리온보딩
- 윤성우 열혈C프로그래밍
- jest
- TopLayer
- import/order
- React
- 노개북
- 아차산
- WSL2
- error
- Storybook
- 스토리 북
- NextApiRequest
- 노마드코더
- 위코드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |