내일배움캠프/Today I Learned
[TIL 2023.08.08] 심화 프로젝트 둘러보미 / 회원가입 만들기
괴코딩
2023. 8. 8. 19:48
❓발생한 이슈/고민
Ui Library로 Ant Design을,
회원가입 form 유효성 검사 수단으로 react-hook-form을 사용하려고 했었는데
<Form onFinish={handleSubmit(onSubmit)}>
이 부분에서 자꾸 이해할 수 없는 오류가 생겼다.
TS2769: No overload matches this call.
Overload 1 of 2, '(props: PolymorphicComponentProps<"web", FastOmit<FormProps<unknown> & { children?: ReactNode; } & { ref?: Ref<FormInstance<unknown>> | undefined; }, never>, void, void, {}, {}>): Element', gave the following error.
Type '(e?: BaseSyntheticEvent<object, any, any> | undefined) => Promise<void>' is not assignable to type '(values: unknown) => void'.
Types of parameters 'e' and 'values' are incompatible.
Type 'unknown' is not assignable to type 'BaseSyntheticEvent<object, any, any> | undefined'.
Overload 2 of 2, '(props: FastOmit<FormProps<unknown> & { children?: ReactNode; } & { ref?: Ref<FormInstance<unknown>> | undefined; }, never>): ReactElement<any, string | JSXElementConstructor<...>> | null', gave the following error.
Type '(e?: BaseSyntheticEvent<object, any, any> | undefined) => Promise<void>' is not assignable to type '(values: unknown) => void'.
63 | <St.SignUpContainer>
64 | {error && <p>{error}</p>}
> 65 | <St.SignUpForm onFinish={handleSubmit(onSubmit)}>
| ^^^^^^^^
66 | <label htmlFor="profileImage">프로필 이미지</label>
67 | <Input type="file" id="profileImage" {...register('profileImage')} />
"이 호출과 일치하는 오버로드가 없습니다."
해결을 위해서는 라이브러리 간의 호환성 문제를 해결하기 위해 적은 수정이 필요하다는데
이 부분을 이해하는데에 시간이 빠듯하기도 하고
특별히 현재 react-hook-form을 꼭 사용해야 하는 이유도 특별히 찾지 못해서 react-hook-form을 사용하지 않기로 했다.
antd만 사용하는걸루~
💡해결과정
return (
<St.SignUpContainer>
<Form onFinish={onSubmit}>
<Form.Item label="프로필 이미지" name="profileImage" rules={[{ required: true, message: '이미지를 업로드해주세요.' }]}>
<Input type="file" id="profileImage" />
</Form.Item>
<Form.Item
label="이메일"
name="email"
rules={[
{ required: true, message: '이메일 주소를 입력해주세요.' },
{ type: 'email', message: '올바른 이메일 형식이 아닙니다.' },
]}
validateStatus={emailError ? 'error' : ''}
help={emailError}
>
<Input type="email" id="email" onChange={() => setEmailError(null)} />
</Form.Item>
<Form.Item label="비밀번호" name="password" rules={[{ required: true, message: '비밀번호를 입력해주세요.' }, passwordValidator()]}>
<Input type="password" id="password" />
</Form.Item>
<Form.Item
label="비밀번호 확인"
name="confirmPassword"
rules={[
{ required: true, message: '비밀번호를 한 번 더 입력해주세요.' },
({ getFieldValue }) => ({
validator(_, value) {
if (!value || getFieldValue('password') === value) {
return Promise.resolve();
}
return Promise.reject(new Error('비밀번호가 일치하지 않습니다.'));
},
}),
]}
>
<Input type="password" id="confirmPassword" />
</Form.Item>
<Form.Item label="닉네임" name="nickname" rules={[{ required: true, message: '닉네임을 입력해주세요.' }]}>
<Input type="text" id="nickname" />
</Form.Item>
{error && <p>{error}</p>}
<Form.Item>
<Button type="primary" htmlType="submit">
회원가입
</Button>
</Form.Item>
</Form>
</St.SignUpContainer>
);
};
export default SignUp;
수정된 코드
회원가입 폼. 생긴게 상당히 마음에 안든다...
🧐궁금점과 부족한 내용
아직 회원가입하면서 프로필 이미지도 같이 넣는 부분도 제대로 구현된 것이 아니고 수정할 부분이 많다.
회원가입 만만하게 봤다가...고생 중
유효성 검증도 여러 경우의 수를 고려해야하니 은근 신경쓸게 많구나..
반응형