공식 홈페이지 : https://react-hook-form.com/
npm install react-hook-form
import { useState } from "react";
function ToDoList() {
const [todo, setTodo] = useState("");
//에러 만들기
const [toDoError, setToDoError] = useState("");
//onChange 이벤트
const onChange = (event: React.FormEvent<HTMLInputElement>) => {
const {
currentTarget: { value },
} = event;
setTodo(value);
};
//onSubmit 이벤트
const onSubmit = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
//글자수가 10자 미만일 때 에러가 발생
if(todo.length < 10) {
return setToDoError("글자 수가 부족함")
}
setToDoError("");
console.log(todo);
};
return (
<div>
<form onSubmit={onSubmit}>
<input onChange={onChange} value={todo} placeholder="Write a to do" />
<button>Add</button>
{/* 에러표시 */}
{toDoError !== "" ? toDoError : null}
</form>
</div>
);
}
export default ToDoList;
import { useForm, SubmitHandler } from "react-hook-form";
//register name별로 타입 지정해줘야함 ㅡㅡ;
interface IFormInput {
firstName: String;
gender: GenderEnum;
}
const { register, handleSubmit } = useForm<IFormInput>();
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register("값의 이름")} />
...
register에는 onChange, onBlur, ref를 갖고 있음.
console.log(register("toDo")); 콘솔찍기
{name: 'toDo', onChange: ƒ, onBlur: ƒ, ref: ƒ}
name: "toDo"
onBlur: async event => {…}
onChange: async event => {…}
ref: ref => {…}
[[Prototype]]: Object
이를 {...} 스프레드 문법으로 풀어내면 input에 name, onBlur, onChange, ref가 props로 들어감
{...register("이름")}
만 써주면 끝 <input {...register("firstName")} />
<select {...register("gender")} >
<input
{...register("email", {
//입력 필수
required: true,
pattern: {
//pattern은 정규식을 이용. @naver.com 형식만 가능하도록 해준다.
value: /^[A-Za-z0-9._%+-]+@naver.com$/,
message: "네이버 이메일만 가능",
},
})}
placeholder="Email"
/>
handlesubmit(데이터가 유효할 때 호출되는 함수 [,유효하지 않을 때 호출되는 함수]
const onVaild = (data: IForm) => {
if(data.password !== data.password1) {
// 만일 password와 password1이 일치하지 않는 경우 발생하는 에러 설정
return setError("password1", {message: "비번이 일치하지 않습니다."},{ shouldFocus: true })
}
};
...
<form onSubmit={handleSubmit(onVaild)}>
formState.error
: Input의 오류를 저장함setError
: 특정한 에러를 발생시킴 const {
register,
watch,
handleSubmit,
//formState.error를 errors로 이름 바꿔줌ㅋ
formState: { errors },
setError,
} = useForm<IForm>();
const onVaild = (data: IForm) => {
if(data.password !== data.password1) {
// 만일 password와 password1이 일치하지 않는 경우 발생하는 에러 설정
return setError("password1", {message: "비번이 일치하지 않습니다."},{ shouldFocus: true })
}
};
const {
register,
watch,
handleSubmit,
formState: { errors },
setError,
} = useForm<IForm>({
// input의 기본값 설정
defaultValues: {
email: "@naver.com",
},
});
공식 문서 - https://react-hook-form.com/
React JS 마스터클래스 - 노마드코더 https://nomadcoders.co/react-masterclass