ReactJS/개념정리
[REACT] React Hook Form - 회원가입 폼 경고메시지 출력하기
xowoony
2023. 4. 17. 15:56
학습일 : 2023. 04. 17
React Hook Form 을 이용하여 회원가입 폼에서 경고메시지를 출력해보자.
참고사항
1.input 태그 안 자바스크립트로 required 항목에 true를 적거나 메세지를 적을 수 있다.
2. minLength의 경우 가령 5라는 값을 적거나, 값과 메세지를 가지는 객체를 줄 수 있다.
3. 정규식(Regular Expression) 사용
(코드에다 작성해준 문자열이 어떤 종류인지, 어떻게 생겨야 하는지를 설정해 줄 수 있음)
정규식 검사 참고 사이트
https://regex101.com/
/^[A-Za-z0-9._%+-]+@naver\.com$/
위 정규식은
앞자리는 대소문자 A부터 Z까지 숫자와 부호들을 전부 포함
뒷자리는 naver.com과 일치하는 문자를 포함하겠다는 뜻이다.
이메일을 정규식으로 검사해보자
pattern을 작성해주고 정규식을 복사해서 넣어준다.
<input
{...register("email", {
required: true,
pattern: {
value: /^[A-Za-z0-9._%+-]+@naver\.com$/,
message: "naver.com 주소만 허용됩니다.",
},
})}
placeholder="email을 입력해주세요."
/>
pattern은 이런식으로 작성해주면 된다.
메세지를 띄우고 싶지 않다면
value: /^[A-Za-z0-9._%+-]+@naver\.com$/ 만 적어주면 된다.
이제 에러를 화면에 표시해보자
일단
const { register, handleSubmit, formState:{errors} } = useForm();
console.log(errors);
로 고치고
이메일 밑에 span태그를 만들어주고
에러를 표시해보면
<span>
{errors?.email?.message as string}
</span>
조건에 맞지 않을 때 해당하는 메시지가 아래에 출력된다.
전체코드
<ToDoList.tsx>
import { useForm } from "react-hook-form";
function ToDoList() {
const {
register,
handleSubmit,
formState: { errors },
} = useForm();
const onValid = (data: any) => {
console.log(data);
};
console.log(errors);
return (
<div>
<form
style={{
display: "flex",
flexDirection: "column",
}}
onSubmit={handleSubmit(onValid)}
>
<input
{...register("email", {
required: "이메일은 필수로 작성해주셔야 합니다.",
pattern: {
value: /^[A-Za-z0-9._%+-]+@naver\.com$/,
message: "오직 naver.com 주소만 허용됩니다.",
},
})}
placeholder="email을 입력해주세요."
/>
<span>
{errors?.email?.message as string}
</span>
<input
{...register("firstname", { required: true })}
placeholder="firstname을 입력해주세요."
/>
<input
{...register("lastname", { required: true })}
placeholder="lastname을 입력해주세요."
/>
<input
{...register("username", { required: true, minLength: 3 })}
placeholder="username을 입력해주세요."
/>
<input
{...register("password", { required: true, minLength: 10 })}
placeholder="password을 입력해주세요."
/>
<input
{...register("password1", {
required: true,
minLength: { value: 5, message: "Your password is too short!" },
})}
placeholder="password1을 입력해주세요."
/>
<button>추가</button>
</form>
</div>
);
}
export default ToDoList;
경고 메시지를
다 적어주면 아래와 같다.
import { useForm } from "react-hook-form";
function ToDoList() {
const {
register,
handleSubmit,
formState: { errors },
} = useForm();
const onValid = (data: any) => {
console.log(data);
};
console.log(errors);
return (
<div>
<form
style={{
display: "flex",
flexDirection: "column",
}}
onSubmit={handleSubmit(onValid)}
>
<input
{...register("email", {
required: "이메일은 필수로 작성해주셔야 합니다.",
pattern: {
value: /^[A-Za-z0-9._%+-]+@naver\.com$/,
message: "오직 naver.com 주소만 허용됩니다.",
},
})}
placeholder="email을 입력해주세요."
/>
<span>{errors?.email?.message as string}</span>
<input
{...register("firstname", { required: "firstname을 입력해주세요." })}
placeholder="firstname을 입력해주세요."
/>
<span>{errors?.firstname?.message as string}</span>
<input
{...register("lastname", { required: "lastname을 입력해주세요." })}
placeholder="lastname을 입력해주세요."
/>
<span>{errors?.lastname?.message as string}</span>
<input
{...register("username", {
required: "username을 입력해주세요.",
minLength: 3,
})}
placeholder="username을 입력해주세요."
/>
<span>{errors?.username?.message as string}</span>
<input
{...register("password", {
required: "password를 입력해주세요",
minLength: { value: 5, message: "5자 이상으로 설정해주세요" },
})}
placeholder="password를 입력해주세요."
/>
<span>{errors?.password?.message as string}</span>
<input
{...register("password_check", {
required: "password를 한번 더 입력해주세요",
minLength: { value: 5, message: "5자 이상으로 설정해주세요" },
})}
placeholder="password를 입력해주세요."
/>
<span>{errors?.password_check?.message as string}</span>
<button>추가</button>
</form>
</div>
);
}
export default ToDoList;
실행결과
이렇게
작성 form에 defaultValue도 줄 수 있다.
const {
register,
handleSubmit,
formState: { errors },
} = useForm<IForm>({
defaultValues: {
email:"@naver.com"
}
});
import { useForm } from "react-hook-form";
interface IForm {
email: string;
firstname: string;
lastname: string;
username: string;
password: string;
password_check: string;
}
function ToDoList() {
const {
register,
handleSubmit,
formState: { errors },
} = useForm<IForm>({
defaultValues: {
email:"@naver.com"
}
});
const onValid = (data: any) => {
console.log(data);
};
console.log(errors);
return (
<div>
<form
style={{
display: "flex",
flexDirection: "column",
}}
onSubmit={handleSubmit(onValid)}
>
<input
{...register("email", {
required: "이메일은 필수로 작성해주셔야 합니다.",
pattern: {
value: /^[A-Za-z0-9._%+-]+@naver\.com$/,
message: "오직 naver.com 주소만 허용됩니다.",
},
})}
placeholder="email을 입력해주세요."
/>
<span>{errors?.email?.message as string}</span>
<input
{...register("firstname", { required: "firstname을 입력해주세요." })}
placeholder="firstname을 입력해주세요."
/>
<span>{errors?.firstname?.message as string}</span>
<input
{...register("lastname", { required: "lastname을 입력해주세요." })}
placeholder="lastname을 입력해주세요."
/>
<span>{errors?.lastname?.message as string}</span>
<input
{...register("username", {
required: "username을 입력해주세요.",
minLength: 3,
})}
placeholder="username을 입력해주세요."
/>
<span>{errors?.username?.message as string}</span>
<input
{...register("password", {
required: "password를 입력해주세요",
minLength: { value: 5, message: "5자 이상으로 설정해주세요" },
})}
placeholder="password를 입력해주세요."
/>
<span>{errors?.password?.message as string}</span>
<input
{...register("password_check", {
required: "password를 한번 더 입력해주세요",
minLength: { value: 5, message: "5자 이상으로 설정해주세요" },
})}
placeholder="password를 입력해주세요."
/>
<span>{errors?.password_check?.message as string}</span>
<button>추가</button>
</form>
</div>
);
}
export default ToDoList;