input
에 값을 입력받고 POST
를 할 때까지 값을 들고 있는 역할을 useState
에 맡겼었다. 처음에는 문제가 없었는데, 페이지가 많아지다보니 값을 입력할 때마다(change event가 발생할 때마다) 화면이 깜빡이는 문제가 발생했다. state가 변경될 때마다 화면이 깜빡여서 제대로 입력할 수 없는 상황이었다.
이 문제를 해결하기 위해 useRef
를 통해 관리하는 방법을 사용하려했는데 결국 이 방법도 state를 사용해야 했다. 그러던 중 로그인과 회원가입 페이지에 사용했던 React Hook Form
라이브러리를 떠올리게 되었다. 이게 왜 이제야 떠올랐는지…
사용법은 매우 간단하다. useForm
hook으로 register와 handleSubmit을 선언하고, 다음과 같이 입력해준다.
onSubmit
속성 안에 handleSubmit
함수가 곧장 선언된다는 것이다. 함수의 인자로는 두 가지가 들어갈 수 있는데, 첫 번째는 input에 들어온 값이 valid할 때 실행되는 함수, 두 번째는 invalid할 때 실행되는 함수이다. 조건을 걸어주는 방법은 밑에서 설명할 것이다.interface IPromiseName {
promiseName: string;
}
function Promise() {
const { register, handleSubmit, setValue } = useForm<IPromiseName>();
const onValid = ({promiseName}: IPromiseName) => {
// ...
setValue("");
}
return (
<form onSubmit={handleSubmit(onValid)}>
<input {...register("promiseName")} />
<button type="submit">생성</button>
</form>
);
}
input
값이 조건에 맞지 않을 때 호출되는 함수이다.interface IPromiseNameInvalid {
promiseName?: {
message?: string;
};
}
function Promise() {
// ...
const onInvalid = ({promiseName}: IPromiseNameInvalid) => {
alert(promiseName.message);
}
return(
<form onSubmit={handleSubmit(onValid, onInvalid)}>
<input
{...register("promsieName", {
required: "약속 이름을 입력해주세요.",
maxLength: {
value: 20,
message: "약속 이름은 20자 이하여야 합니다.",
},
}}
/>
</form>
);
}