폼의 입력값을 처리하는 컴포넌트의 기본예제
import { useState } from 'react';
export default function StateForm() {
const [myForm, setMyForm] = useState({
name: '김철수',
age: 20
});
const handleForm = e => {
setMyForm({
const { name, value } = e.target;
setForm(prevForm => ({
...prevForm,
[name]: value
}));
});
};
const show = () => {
console.log(`안녕하세요, ${myForm.name}(${myForm.age}세) 님!`);
};
return (
<form>
<div>
<label htmlFor="_name_">이름: </label>
<input id="_name_" name="name" type="text"
onChange={handleForm} value={myForm.name} />
</div>
<div>
<label htmlFor="_age_">나이:</label>
<input id="_age_" name="age" type="number"
onChange={handleForm} value={myForm.age} />
</div>
<div>
<button type="button" onClick={show}>보내기</button>
</div>
<p>안녕하세요, {myForm.name}({myForm.age}세) 님!</p>
</form>
);
}
- React Hook Form 써서 코드 짧게 쓰는 방법도 많이 사용된다. 또한, 유효성검사 라이브러리인 Yup 으로 유효성 검사 자동화하는 방법을 쓰는 것도 좋다.
// 먼저 라이브러리를 설치한다.
npm install react-hook-form
npm install yup
import { useForm } from 'react-hook-form';
import { yupResolver } from '@hookform/resolvers/yup';
import * as yup from 'yup';
const schema = yup.object({
name: yup.string().required('이름은 필수입니다.'),
age: yup.number().required('나이는 필수입니다.').positive('양수만 가능합니다.').integer('정수여야 합니다.')
}).required();
export default function MyForm() {
const { register, handleSubmit, formState: { errors } } = useForm({
resolver: yupResolver(schema)
});
const onSubmit = (data) => {
console.log(data);
};
return (
<form onSubmit={handleSubmit(onSubmit)}>
<div>
<label>이름</label>
<input {...register('name')} />
{errors.name && <p>{errors.name.message}</p>}
</div>
<div>
<label>나이</label>
<input type="number" {...register('age')} />
{errors.age && <p>{errors.age.message}</p>}
</div>
<button type="submit">제출</button>
</form>
);
}