<Input isRequried />
으로 에러 메세지를 넘겨주면 매우 편해질 때까 있다. onValidationStatusChanged
으로 각 input에 넘겨줄 수도 있지만, 결국 이 방식은 보일러플레이트를 증가시키면서 다른 이슈를 만든다.검증 상태는 각 input 컴포넌트에서 가지고 있어야하낟. 하지만 폼 컴포넌트는 특정한 필드가 유효한지 알 수 없다.
이건 다음과 같은 의미를 가진다.
onValidationStatusChanged
으로 각 input에 넘겨주는 생각을 바로 떠올렬 수도 있지만, 결국 전체 코드의 보일러플레이트를 증가시킨다. 또한 다른 이슈들 또한 만든다.
자동적으로 폼 컴포넌트에 검증 상태를 넣는 방식은 실제로 React Reform이란데서 사용하고 있다. 하지만 이 방식 또한 문제가 있다.
어떤 검증들은 하나의 필드에서만 일어난다. 항상 중심적인 경우만 있지 않다.
필드 중심의 접근 방식을 위해서는 다른 API를 도입해야 하는데, 이는 없애고자 하는 보일러 플레이트처럼, 단지 이 경우를 돕기위해서이다. 결국 보일레 플레이트는 제거되지 않는다. 하지만 결국 본질적으로 같은 것에대한 좇같은 두 가지 API를 가질 뿐이다.
리액트에선 일반적으로 몇몇의 데이터와 상태가 뷰로 나타난다. 투두 앱이라면, 투투 리스트는 투두 객체 리스트의 뷰이다.
같은 방식으로 폼은 폼 데이터의 뷰일 뿐이다. 폼이 자신의 데이터를 가지고 있다. 폼이 내부 어딘가에서 데이터 유효성 검증규칙을 표현한다면 당연한 것이다. 폼 컴포넌트는 유닛을 뿐이라고 말할 수 있다.
하지만 검증이 렌더안에 있다면, 이 데이터 관계는 효과적으로 제거된다.
자체적으로 검사하기
function validate(email, password) {
// true means invalid, so our conditions got reversed
return {
email: email.length === 0,
password: password.length === 0,
};
}
리덕스폼은 데이터 관계를 first-class로 만든다. 폼 데코레이터안에 검증함수를 받으들이므로서
const validate = values => {
const errors = {};
if (!values.email) {
errors.email = 'Required';
}
if (!values.password) {
errors.password = 'Required';
}
return errors;
}
export default reduxForm({
form: 'signInForm',
validate,
})(SignInForm)
가끔, 화면 위에 모든 것들이 검증되기 원할 수 있다. 만약 필드가 보이지 않는 경우에도 말이다. 예를 들면 멀티 스텝 폼 같은 경우가 있을 수 있다.