프로젝트 진행중에 중복클릭이 가능하여 같은 폼을 여러번 보내는 문제가 발생했다. 개발자도구에서 network throttling을 3g로 걸어주니 서버에 호출을 받기까지 시간이 2초정도 걸리더라...
이렇게 개발자가 의도하지 않은 동작을 막기위해 isLoading 메서드를 사용했다.
const [isLoading, setIsLoading] = useState(false);
const handleConfirmSubmit = async () => {
if (isLoading) {
return;
}
setIsLoading(true);
try {
const sushiData = {
title,
content,
maxAnswers,
category,
sushiType,
};
console.log("등록된 내용:", sushiData);
const response = await dispatch(createSushi(sushiData));
const { success, data, error } = response.payload;
const { token } = data;
const shareUrl = `share/${token}`;
setShareUrl(shareUrl);
console.log("공유 URL:", shareUrl);
setShowModal(false);
setShowCompleteModal(true);
} finally {
setIsLoading(false);
}
};
이런식으로 isLoading 메서드를 useState를 통해 걸어줄 수 있다. 이런 방식은 다음과 같은 문제점을 가지고 있다.
이러한 문제들을 방지하기 위해 useRef를 사용하는 것이 권장된다.
const dispatch = useDispatch();
const isSubmittingRef = useRef(false);
const reRender = useCallback(() => {}, []);
const handleConfirmSubmit = async () => {
if (isSubmittingRef.current) {
return;
}
isSubmittingRef.current = true;
reRender();
try {
const sushiData = {
title,
content,
maxAnswers,
category,
sushiType,
};
const response = await dispatch(createSushi(sushiData));
const { success, data, error } = response.payload;
const { token } = data;
const shareUrl = `share/${token}`;
setShareUrl(shareUrl);
setShowModal(false);
setShowCompleteModal(true);
} finally {
isSubmittingRef.current = false;
reRender();
}
};
useRef를 사용하는 방식의 장점
Claude와의 대화를 통해 useState를 통해 중복클릭 방지를 하는 방안을 적용했다. 그러다가 혹시 다른 문제가 발생하지 않을까? 하고 구글링을 시작했다. 그러다가 https://happysisyphe.tistory.com/72
사이트를 발견하고 useRef를 사용하는 방법을 적용했다. 또한 더욱 안정적인 방법 두가지 또한 알게 되었다.
AI에게만 의존하지말고 구글링도 계속해서 더 실력있는 개발자가 되자!