npm install react-hook-form
register("name")
를 통해 name
으로 등록한다.
watch("name")
을 통해 name
의 값을 실시간으로 탐지할 수 있다.
function Form() {
const {
register,
watch,
} = useForm<IForm>();
console.log(watch("name"));
return (
<>
<form>
<input {...register("name")} placeholder="name" />
</form>
</>
);
}
t
te
tes
test
function Form() {
const { register, handleSubmit } = useForm<IForm>();
const onSubmit: SubmitHandler<IForm> = (data) => {
console.log(data);
};
return (
<>
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register("name")} placeholder="name" />
<button>submit</button>
</form>
</>
);
}
onSubmit
인자에 handleSubmit(onSubmit)
을 전달한다. 정의하는 것이 아닌 호출해야 한다.
다음과 같이 입력하고 submit 해보면 페이지는 refresh 되지않고 값을 object 타입으로 출력해준다.
input
console
{name: 'test'}
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register("name")} placeholder="name" />
<input {...register("email")} placeholder="email" />
<input {...register("password")} placeholder="password" />
<input {...register("password2")} placeholder="password2" />
<button>submit</button>
</form>
다음과 같이 입력후 submit 한 결과이다.
{name: '지성팍', email: 'ex@ex.com', password: 'pwd1', password2: 'pwd2'}
register()
의 두 번째 인자로, object를 전달할 수 있다.
값이 유효한지 체크하는 object이다.
type
에는 required
뿐만 아니라 pattern, minLength, maxLength, validate
등 다양한 type
이 존재한다. validate
는 직접 만든 함수를 이용해 validation check한다.
<input {...register("name", { required: true })} placeholder="name" />
required: true
를 설정하고 입력하지 않았을 경우를 살펴보자.
function Form() {
const {
register,
handleSubmit,
formState: { errors },
} = useForm<IForm>();
const onSubmit: SubmitHandler<IForm> = (data) => {
console.log(data);
};
console.log(errors);
return (
<>
<form onSubmit={handleSubmit(onSubmit)}>
<input {...register("name", { required: true })} placeholder="name" />
<input {...register("email", { required: true })} placeholder="email" />
<input
{...register("password", { required: true })}
placeholder="password"
/>
<input
{...register("password2", { required: true })}
placeholder="password2"
/>
<button>submit</button>
</form>
</>
);
}
자동으로 커서가 에러 발생 지점으로 옮겨진다.
type
에 의해 발생했는지 알 수 있다.password: {type: 'required', message: '', ref: input}
<input
{...register("name", {
required: {
value: true,
message: "name is required",
},
})}
placeholder="name"
/>
특정 type
에 대해 error 발생시, message
를 설정하고 출력할 수 있다.
<span>{errors?.name?.message}</span>
setError
error를 설정할 수 있다.
submit했을 때, password
password2
두 개의 값이 일치하지 않는다면 error를 설정하고, shouldFocus
를 통해 커서를 password
로 이동시켜준다.
function ToDoList() {
const {
register,
handleSubmit,
formState: { errors },
setError,
} = useForm<IForm>();
const onSubmit: SubmitHandler<IForm> = (data) => {
if (data.password !== data.password2) {
setError(
"password",
{ message: "passwords are not same" },
{ shouldFocus: true }
);
}
};
return (
<>
<form onSubmit={handleSubmit(onSubmit)}>
//...(skip)
<input
{...register("password", { required: true })}
placeholder="password"
/>
<span>{errors?.password?.message}</span>
<input
{...register("password2", { required: true })}
placeholder="password2"
/>
<button>submit</button>
</form>
</>
);
}
좋은 글 잘 읽고 갑니다