- input마다 setState, onChange Fn 만들어야 함
function ToDoList() {
const [toDo, setToDo] = useState("");
const onChange = (event: React.FormEvent<HTMLInputElement>) => {
const {
currentTarget: { value },
} = event;
setToDo(value);
};
const onSubmit = (event: React.FormEvent<HTMLFormElement>) => {
event.preventDefault();
console.log(toDo);
};
return (
<div>
<form onSubmit={onSubmit}>
<input onChange={onChange} value={toDo} placeholder="Write a to do" />
<button>Add</button>
</form>
</div>
);
}
- form validation 많더라도 유효성 검사가 더 편리함
register 함수가 다 함. setState, onChnage 이벤트 핸들러 필요 없다.
- form의 onSubmit은
handleSubmit이 대신 처리해줄거라고~!
handleSubmit : validation, preventDefault, 등등 해줌
handleSubmit은 2개 인자를 가질 수 있고 onVaild는 필수
onVaild 데이터 유효할 때 호출되는 함수. validation 끝나면!
onInvalid 데이터 유효하지 않을 때 호출. 필수 아님
formState validation의 에러를 객체로 확인할 수 있음
setValue : 제출 후 input 값 비워줄 수 있음
import { useForm } from "react-hook-form"
function List() {
const { register, watch, handleSubmit, formState, setValue } = useForm();
console.log(watch());
const onVaild = (data) => {
console.log(data);
setValue("input name", "")
}
return (
<form onSubmit={handleSubmit()}>
<input
{...register("email")} placeholder="Email" />
</form>
)
}
{...register("email", {required:true, minLength: 10})}
{...register("password", {required:"패스워드 입력하세요"
, minLength: 10})}
정규식으로 패턴 검사하기
<input
{...register("email", {required:true,
pattern: /^[A-Za-z0-9._%+-]+@naver.com$ })} />
<input
{...register("email", {required:"이메일을 입력하세요",
pattern: {
value:/^[A-Za-z0-9._%+-]+@naver.com$,
message: "Only naver.com emails allowed"
}
})} />
<sapn> {formState.errors?email?.meassage} </span>
- IForm 인터페이스에 입력 받아야 하는 항목들 넣기
- useForm 과 Onvaild 에 인터페이스 적용
interface IForm {
email: string;
password: string;
passwordConfirm: string;
extraError?: string;
}
const { register, watch, handleSubmit, formState } = useForm<IForm>();
const onVaild = (data: IForm) => console.log(data)
const { register, watch, handleSubmit, formState } = useForm<IForm>({
defaultValues: {
email: "@naver.com"
}
});
- password와 password 확인이 같지 않을 경우 에러 발생시키기
setError
const { register, handleSubmit, formState:{errors}, setError } = useForm<IForm>();
const onVaild = (data: IForm) => {
if(data.password !== data.passwordConfirm) {
setError("passwordConfirm", {message:"비번이 다릅니다"},
{shouldFocus: true})
}
setError("extraError", {message: "Server Offline"})
}
return (
...
<span>{errors?.extraError?.message}</span>
)
- 닉네임에서 특정 단어를 허용하지 않게하기
validate 는 함수를 값으로 가짐. 인자로 현재 쓰여지는 값을 받음.
validate는 하나의 함수 또는 여러 함수가 있는 객체가 될 수 있음
- async로 비동기로 만들어서 서버에 확인하고 응답을 받을 수 있음(중복 닉네임)
<input>
{...register("nickName",
{ required: true, validate: (value) =>
value.includes("fuck") ? "허용되지 않습니다" : true,
})}
</input>
<input>
{...register("nickName",
{ required: true, validate: {
noFuck: (value) => value.includes("fuck") ? "허용되지 않습니다" : true,
noSibal: (value) => ...중략
},
})}
</input>
validation 정리
register 내부의 required에 message 적기
...register("email" , {required: "필수 입력입니다"})
register 내부에 validate 쓰기
...register("nickName", { required: true, validate: ... }
register 내부에 옵션 사용하기 ex) minLength
...register("nickName", { required: true, minLength: 2 }
minLength: {
value: 2,
message: "너무 짧습니다"
}