
form 라이브러리로, Formik 공식문서 에서는 Formik이 가지는 장점을 아래와 같이 설명합니다.
생태계 측면에서, 생태계의 크기에서 react-hook-form, formik 이 2가지 중 선택할 수 있습니다.
사용성 측면에서, formik에서 제공하는 컴포넌트를 사용할 경우 코드 양을 줄일 수 있습니다.
성능 측면에서, react-hook-form은 번들 크기가 작아 첫 렌더링 속도가 빠르고, 리렌더링 횟수가 월등히 적기 때문에 성능 측면으로 본다면 react-hook-form이 더 좋습니다.
유연성 측면에서, react-hook-form은 Uncontrolled 방식으로 성능이 뛰어나지만, 폼 값을 컨트롤하기 어렵습니다. 이 단점을 보완하기 위해 watch라는 기능이 존재하지만, formik는 Controlled 방식이기 때문에 폼 값을 좀 더 유연성 있게 다룰 수 있어 유연성 측면에서는 formik가 더 좋습니다.(watch를 사용해 react hook form을 controlled 처럼 이용할 수 있으나 controlled를 지향하는 react에서 추천하는 방식은 아닙니다.)
Formik은 리액트가 권장하는 Controlled Component를 만드는 것에 힘썼다면, React-Hook-Form은 퍼포먼스 최적화에 힘을 실었다고 할 수 있습니다.
먼저, 컴포넌트가 가장 외곽이 됩니다. 이는, initialValues, onSubmit 2가지 Props를 기본적으로 요구받습니다.
<< Formik Props >>
굵은 글씨만 참고해주셔도 괜찮습니다.
<< Render Props >>
<input> 등의 각 name과 이에 해당하는 value들의 값을 저장하는 객체. 각 name을 key로 값을 조회 가능하며, 위의initialValutes로 초기화.<form>의 onSubmit 이벤트 핸들러로 등록<input> 등의 onChange 이벤트 핸들러로 등록<input> 등의 onBlur 이벤트 핸들러로 등록const initialValues = { // values의 초기값을 설정해주세요.(폼을 통해 입력받을 값들 초기값)
storeNumber: '',
name: 0,
name: false, // 이런 식으로 name 자리에 변수명을 작성해주시고, 초기값을 넣어주면 됩니다.
};
const schema = object().shape({ // yup을 이용한 validation
storeNumber: string() // name 자리에 validation할 변수명을 넣어주고, 그 변수의 타입을 지정해주세요. 예시로 string(), number(), object() 등이 있습니다.
.required(ERROR_MESSAGE.STORE_REQUIRED) // 하단 yup 정리 내용 참고
.matches(/^[0-9]+$/, ERROR_MESSAGE.STORE_NUMBER)
.length(10, ERROR_MESSAGE.STORE_LENGTH),
});
const submitForm = (values: initialValuesType) => { // 폼을 제출할 때 실행되는 헨들러 내용을 함수로 만들어주세요. 만든 함수는 onSubmit에 넣어주세요.
console.log(values)
};
return (<Formik // Formik으로 폼 감싸주기
initialValues={initialValues} // 폼으로 입력받은 값들 초기값 설정
validationSchema={schema} // 각 변수마다 validation할 조건들 설정
onSubmit={submitForm} // 폼 제출시 실행할 헨들러 설정
>
{formik => { // formik을 props로 전달
return (
<Form> // 자유롭게 Form 작성
<label className="text-xs font-semibold" htmlFor="storeNumber">
사업자 등록번호
</label>
<Field // 이때 input 대신 Field 사용, input과 동일하게 사용하며, onChange등은 줄 필요가 없고 필수로 type과 name은 지정해주셔야 합니다.
type="text"
name="storeNumber" // 이때 name이 곧 각 입력값을 구분하는 변수명이자 아이디가 되므로 초기값 설정한 name과 동일하게 지정해주세요.
className={`h-12 w-full rounded ${
formik.errors.storeNumber ? 'border-red' : 'border-yellow'
} bg-white pl-3 outline-none focus:border-2`}
placeholder="1007999997"
/>
<ErrorMessage // formik에서 제공하는 ErrorMessage를 사용하면 자동으로 validation을 확인해 error일 경우 표시됩니다. (error && <div>에러 메시지</div> 할 필요 x)
name="storeNumber" // 이때 또한 해당 변수명을 name으로 일치시켜야 합니다.
component="span" // 에러 메시지는 어떤 형태로 보여줄 지 설정할 수 있습니다. p태그, span태그, div태그 등 다양하게 가능합니다.
className="w-full text-left text-xs text-red"
/>
<PrimaryButton type="submit">다음</PrimaryButton> // 버튼 onClick 설정없이 type을 submit으로 설정해주세요.
</Form>
);
}}
</Formik> )
이 외에 좀 더 자세한 내용이나 다른 예제들을 참고하고 싶다면 아래 참고 자료에서 formik 공식 문서와 formik 예제를 참고해주세요.
Yup은 JavaScript에서 사용되는 객체 스키마 유효성 검사 라이브러리입니다. 이를 통해 간편하게 데이터의 유효성을 확인하고 검증할 수 있습니다.
// 에러 메시지 자리에 이 validation을 어겼을 때 띄울 에러 메시지를 넣어주기
//string()
.required(에러 메시지) // 필수 입력란
.matches(보통 정규표현식, 에러 메시지) // 입력 양식 지정
.length(길이, 에러 메시지), // string일 경우 문자열 길이 지정
.min(조건, 에러 메시지) // 최소 문자열 길이 지정
.max(조건, 에러 메시지) // 최대 문자열 길이 지정
//number()
.required(에러 메시지) // 필수 입력란
.positive(에러 메시지) // 보통 변수 타입이 number()라면 양수인지 확인
.negative(에러 메시지) // 음수인지 확인
.integer(에러 메시지) // 정수인지 확인
//array()
.required(에러 메시지) // 필수 입력란
.length(길이, 에러 메시지), // 배열 길이 지정
.min(조건, 에러 메시지) // 최소 배열 길이 지정
.max(조건, 에러 메시지) // 최대 배열 길이 지정
그 외의 조건들은 하단의 yub schema 예제 참고 블로그와 yup 제공 기능 종류를 참고해주세요.
npm trend 다운로드 그래프
react hook form vs formik