<input {...register('사용하고 싶은 이름')}/>
name='email',value={email} onChange={onChange}
와 똑같기때문mode 옵션을 통해 폼 검증이 언제 일어나는지를 정의할 수 있다. 다양한 mode 값들은 폼의 유효성을 검사하는 시점을 조절하여, 사용자 경험을 최적화하고 개발자가 원하는 방식으로 폼 동작을 제어할 수 있게 한다
onSubmit:
목적: 가장 흔하게 사용되며, 폼 제출(submit) 시에 유효성 검사를 수행합니다.
특징: 사용자가 폼을 제출할 때까지 오류 메시지를 표시하지 않아, 폼 입력 과정에서의 사용자 경험이 개선됩니다.
onChange:
목적: 입력 필드의 값이 변경될 때마다 유효성 검사를 수행합니다.
특징: 사용자가 폼을 작성하는 동안 실시간으로 유효성 검사를 하여, 사용자에게 즉각적인 피드백을 제공합니다.
onBlur:
목적: 입력 필드가 포커스를 잃었을(focus out or blur) 때 유효성 검사를 수행합니다.
특징: 사용자가 다음 입력 필드로 넘어갈 때마다 유효성 검사를 하여, 너무 많은 실시간 검사로 인한 사용자의 혼란을 줄입니다.
onTouched:
목적: 필드가 한 번이라도 포커스되었다가 블러(blur) 상태가 됐을 때 유효성 검사를 수행합니다.
특징: 사용자가 필드를 한 번 이상 건드린 후에만 유효성 검사를 하여, 필드에 처음 입력할 때의 압박을 줄입니다.
all:
목적: 입력의 모든 변화와 블러 상태에 대해 유효성 검사를 즉각적으로 수행합니다.
특징: 가장 엄격한 유효성 검사 모드로, 사용자에게 가장 실시간 피드백을 제공합니다.
예시
import { useForm } from "react-hook-form"; const {register, handleSubmit, watch, formState: {errors, isSubmitting}} = useForm(); //handleSubmit은 onSubmit을 호출하기 전에 입력 내용을 확인한다 <form onSubmit={handleSubmit(onSubmit)}> <Input placeholder="password" id="password" type="password" {...register('password', { //필수요소 required: '비밀번호를 입력해주세요.', minLength: { message: '비밀번호는 5글자 이상 입니다.', value: 5, }, })} /> //minLength에 충족하지 못할때: message //값이 비었을때 required {errors.password?.message} <button type='submit' disabled={isSubmitting}> Login </button> </form>
import { yupResolver } from "@hookform/resolvers/yup";
import * as yup from "yup";
import errMessage from "../../src/commons/validatorError.js";
const initValue = {
email: "",
password: "",
nick: "",
phone: "",
};
const regexSpacing = /^[^\s]+$/;
const regexEmailKo = /^[^ㄱ-ㅎ|ㅏ-ㅣ|가-힣]+$/;
const regexNick = /^[a-z|A-Z|0-9|가-힣]/;
const regexPasswd =
/^(?=.*[a-zA-z])(?=.*\d)(?=.*[$`~!@$!%*#^?&\\(\\)\-_=+])(?!.*[^a-zA-z0-9$`~!@$!%*#^?&\\(\\)\-_=+])/;
const schema = yup.object().shape({
email: yup
.string()
.email(errMessage.email)
.matches(regexEmailKo, errMessage.email)
.required(),
password: yup
.string()
.min(5, errMessage.passwdMin(5))
.matches(regexPasswd, errMessage.passwdRegex) //영문과 숫자, 기호를 최소 1글자씩 포함해주세요
.matches(regexSpacing, errMessage.passwdSpacing) //비밀번호에는 띄어쓰기를 사용할 수 없어요
.required(),
nick: yup
.string()
.max(8, errMessage.nickMax(8))
.matches(regexNick, errMessage.nickRegex)
.matches(regexSpacing, errMessage.nickSpacing)
.required(),
phone: yup.number().required("숫자만 입력할 수 있어요"),
import { useForm } from "react-hook-form";
import { yupResolver } from "@hookform/resolvers/yup";
import * as yup from "yup";
import errMessage from "../../src/commons/validatorError.js";
export default function Join() {
const initValue = {
email: "",
password: "",
nick: "",
phone: "",
};
const regexSpacing = /^[^\s]+$/;
const regexEmailKo = /^[^ㄱ-ㅎ|ㅏ-ㅣ|가-힣]+$/;
const regexNick = /^[a-z|A-Z|0-9|가-힣]/;
const regexPasswd =
/^(?=.*[a-zA-z])(?=.*\d)(?=.*[$`~!@$!%*#^?&\\(\\)\-_=+])(?!.*[^a-zA-z0-9$`~!@$!%*#^?&\\(\\)\-_=+])/;
const schema = yup.object().shape({
email: yup
.string()
.email(errMessage.email)
.matches(regexEmailKo, errMessage.email)
.required(),
password: yup
.string()
.min(5, errMessage.passwdMin(5))
.matches(regexPasswd, errMessage.passwdRegex) //영문과 숫자, 기호를 최소 1글자씩 포함해주세요
.matches(regexSpacing, errMessage.passwdSpacing) //비밀번호에는 띄어쓰기를 사용할 수 없어요
.required(),
nick: yup
.string()
.max(8, errMessage.nickMax(8))
.matches(regexNick, errMessage.nickRegex)
.matches(regexSpacing, errMessage.nickSpacing)
.required(),
phone: yup.number().required("숫자만 입력할 수 있어요"),
});
const {
register,
handleSubmit,
watch,
formState: { errors },
} = useForm({
mode: "onChange",
resolver: yupResolver(schema),
});
const handleJoin = async (data) => {
const reqData = {
email: data.email,
password: data.password,
nick: data.nick,
phone: data.phone,
};
const result = await httpRequest("POST", `/login/v2`, reqData);
if (result.success) {
console.log("회원가입 성공!");
route.replace("/room");
} else if (result.status === 409) {
alert("이미 가입되어 있는 회원입니다.");
}
};
return (
<>
<form
onSubmit={handleSubmit(handleJoin)}
style={{ display: "flex", flexDirection: "column" }}
>
<label>
email:
<input
name="email"
initValue={initValue.email}
{...register("email")}
/>
<p className="loginNotice">{errors.email?.message}</p>
<button type="button">중복확인</button>
<button type="button">발송</button>
</label>
<label>
PW:
<input
type="password"
name="password"
initValue={initValue.password}
{...register("password")}
/>
<div className="loginNotice">{errors.password?.message}</div>
</label>
<label>
Nick Name:
<input
name="nick"
initValue={initValue.nick}
{...register("nick")}
/>
<p className="loginNotice">{errors.nick?.message}</p>
<button type="button">중복확인</button>
</label>
<label>
Phone Number:
<input
name="phone"
initValue={initValue.phone}
{...register("phone")}
/>
<p className="loginNotice">{errors.phone?.message}</p>
<button type="button">인증</button>
</label>
<button className="joinButton">Join</button>
</form>
</>
);
}
https://rossbulat.medium.com/introduction-to-yup-object-validation-in-react-9863af93dc0e