결과

내용
- name 조건: 값의 길이가 1이거나, 4보다 많거나, 값이 없을때
- phone number 조건: 값의 길이가 13보다 작거나
- content 조건: 값의 길이가 3보다 작거나, type이 string일때
조건부 렌더링을 통해 에러 메세지를 보여줌
- 값이 모두 만족하면 '전송되었습니다.' 라는 알림창이 뜨고 입력된 값이 콘솔로 찍힘
코드
const [values, setValues] = {
nameValue: '',
numberValue: '',
contentValue: '',
};;
const [inputStatus, setInputStatus] = useState({});
const [errCheck, setErrCheck] = useState(false);
const handleChange = e => {
const { value, name } = e.target;
setValues({
...values,
[name]: value,
});
};
const handleSubmit = e => {
e.preventDefault();
setInputStatus(err(values));
setErrCheck(true);
};
const err = values => {
let errors = {};
if (
values.nameValue.length === 1 ||
values.nameValue.length > 4 ||
!values.nameValue
) {
errors.nameValue = '이름을 확인해주세요.';
}
if (values.numberValue.length < 13) {
errors.numberValue = '휴대번호를 확인해주세요.';
}
if (values.contentValue.length < 3 || !typeof contentValue === 'string') {
errors.contentValue = '내용을 확인해주세요.';
}
return errors;
};
useEffect(() => {
if (Object.keys(inputStatus).length === 0 && errCheck) {
submitForm();
}
}, [inputStatus]);
const submitForm = () => {
console.log(values);
if (Object.keys(inputStatus).length === 0 && errCheck) {
alert('전송되었습니다.');
setValues({
nameValue: '',
numberValue: '',
contentValue: '',
});
}
};
return(
{}
<ContentWrap onSubmit={handleSubmit}>
<ContentBox>
<div>Name</div>
<ContentInput
name="nameValue"
defaultValue={values.nameValue}
onChange={handleChange}
/>
{}
{inputStatus.nameValue && <ErrMes>{inputStatus.nameValue} </ErrMes>}
</ContentBox>
<ContentBox>
<div>Phone Number</div>
<ContentInput
name="numberValue"
defaultValue={values.numberValue}
onChange={handleChange}
/>
{inputStatus.numberValue && (
<ErrMes>{inputStatus.numberValue}</ErrMes>
)}
</ContentBox>
<ContentBox>
<div>Content</div>
<ContentInput
name="contentValue"
defaultValue={values.contentValue}
onChange={handleChange}
/>
{inputStatus.contentValue && (
<ErrMes>{inputStatus.contentValue}</ErrMes>
)}
</ContentBox>
<Submit type="submit" onKeyUp={handleSubmit} errCheck={errCheck}>
Send
</Submit>
</ContentWrap>
);