React : 데이터 로딩 및 에러 처리하기
by 담담이담function ReviewForm() {
const [isSubmitting, setIsSubmitting] = useState(false);
const [submittingError, setSubmittingError] = useState(null);
먼저 로딩과 에러를 처리하기 위한 state를 만들어준다.
리뷰를 제출 중일 때도 제출하기 버튼을 누를 수 있게 된다면
같은 요청을 여러 번 보내게 된다.
이를 방지하기 위해 로딩 중일 때는 확인(제출) 버튼을 클릭하지 못하게 만드려고 한다.
const handleSubmit = async (e) => {
e.preventDefault();
const formData = new FormData();
formData.append("title", values.title);
formData.append("rating", values.rating);
formData.append("content", values.content);
formData.append("imgFile", values.imgFile);
try {
setSubmittingError(null);
setIsSubmitting(true);
await createReview(formData);
} catch (error) {
setSubmittingError(error);
return;
} finally {
setIsSubmitting(false);
}
setValues(INITIAL_VALUES);
console.log(values);
};
try가 시작되면 SubmittingError를 null로 설정한 다음,
catch에서 error를 만나면 error 객체를 submittingError로 설정하고 리턴해준다.
제출 중이라는 걸 의미하는 isSubmitting을 try가 시작되면 true로 설정하고,
에러를 만나지 않든 만나든 반드시 지나치는 finally 구문에서
isSubmitting을 false로 만들어준다.
return (
<form className="ReviewForm" onSubmit={handleSubmit}>
<FileInput
name="imgFile"
value={values.imgFile}
onChange={handleChange}
/>
<input name="title" value={values.title} onChange={handleInputChange} />
<RatingInput
name="rating"
value={values.rating}
onChange={handleChange}
/>
<textarea
name="content"
value={values.content}
onChange={handleInputChange}
/>
<button type="submit" disabled = {isSubmitting}>확인</button>
{submittingError?.message && <div>{submittingError.message}</div>}
</form>
);
}
마지막으로 확인 버튼에 disabled 속성으로 isSubmitting을 넣어주어,
isSubmitting이 true일 때, 즉 제출 중일 때는 버튼을 비활성화 시켜준다.
또한 에러가 존재하면, 에러 메세지를 보여줄 수 있도록 조건부 렌더링 식을 사용해줬다.
'React' 카테고리의 다른 글
useEffect의 실행 시점과 클린업 함수의 실행 시점 (1) | 2024.01.08 |
---|---|
React.memo, useCallback, useMemo 차이 (0) | 2024.01.06 |
React : 사이드 이펙트와 useEffect (0) | 2023.10.24 |
React : ref와 useRef (0) | 2023.10.24 |
React : 입력 폼 (0) | 2023.10.24 |
블로그의 정보
유명한 담벼락
담담이담