작성
·
194
·
수정됨
0
안녕하세요. 7.7)리뷰 삭제 기능 구현하기를 하는 중인데, 혹시 바로 삭제하지 않고 중간에 alert 같은 걸로 정말 삭제할지 체크하고 그 다음에 삭제하는 식으로는 어떻게 하면 좋을까요? form 태그에 onsubmit을 달아서 중간에 끼어드는? 방식으로 해볼까 했는데, 뭔가 useActionState랑 호환을 어떻게 해야할지 잘 모르겠네요...
아래 코드를 작성해서 해결했습니다!
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
const confirmDelete = confirm(`댓글을 정말 삭제하시겠습니까?`);
if (confirmDelete) {
const form = e.currentTarget;
form.requestSubmit(); // 폼을 강제로 제출
}
};
답변 3
0
저도 질문자님과 같이 구현을 시도하다가 공유하고 싶어서 답글 남깁니다.
사용자가 "삭제하기" 버튼을 클릭했을 때 삭제 확인 팝업이 나타나고, 사용자가 "확인"을 클릭했을 때만 폼이 제출되어야 합니다. 그러나 "취소"를 클릭했을 때도 폼이 제출되었습니다.
e.preventDefault()
를 사용하여 기본 폼 제출 동작을 막고, 사용자가 "확인"을 클릭했을 때만 requestSubmit()
이 호출해 폼을 제출하도록 구현했습니다.
"use client";
import { useActionState } from "react";
import deleteReviewAction from "@/actions/delete-review.action";
export default function ReviewItemDeleteButton({
reviewId,
bookId,
}: {
reviewId: string;
bookId: string;
}) {
const [state, formAction, isPending] = useActionState(
deleteReviewAction,
null
);
const handleSubmit = (e: React.FormEvent<HTMLFormElement>) => {
const confirmed = confirm("정말로 삭제하시겠습니까?");
if (confirmed) e.currentTarget.requestSubmit();
else e.preventDefault();
};
return (
<form action={formAction} onSubmit={handleSubmit}>
<input type="text" name="reviewId" value={reviewId} hidden readOnly />
<input type="text" name="bookId" value={bookId} hidden readOnly />
<button type="submit" disabled={isPending}>
삭제하기
</button>
</form>
);
}
0
0
안녕하세요, 인프런 AI 인턴입니다. He T (Tty)님!
리뷰 삭제 기능을 구현하실 때, 사용자가 정말로 삭제할 것인지 확인하는 경고창을 추가하고 싶으신 것 같습니다. 이와 같은 상황에서는 JavaScript의 window.confirm
메서드를 활용하면 효과적입니다. window.confirm
은 확인창을 띄워 사용자의 동의를 구할 수 있게 해줍니다.
다음은 간단한 예제 코드입니다:
const handleDelete = (id) => {
if (window.confirm("정말로 삭제하시겠습니까?")) {
// 여기서 실제 삭제 로직을 수행합니다.
onDelete(id);
}
};
// 사용 방식 예시
<button onClick={() => handleDelete(item.id)}>삭제</button>
이 코드는 사용자에게 삭제 여부를 확인한 후, onDelete
함수를 호출하여 리뷰 항목을 삭제하는 로직을 보여줍니다. window.confirm
을 통해 사용자에게 확인 메시지를 표시하고, 사용자가 “확인”을 누르면 실제 삭제 로직이 실행됩니다.
form 태그의 onsubmit
대신 버튼 클릭 시 이벤트를 걸어 처리하는 방식이 더 일반적이며, 이는 프론트엔드 라이브러리 및 프레임워크(React, Next.js 등)에서 수월하게 사용할 수 있는 방법입니다.
추가적인 질문이 있으시면 언제든지 문의해 주세요. 기존의 게시물 중에서 유사한 사례나 해결방법이 있을 수도 있으니, 아래의 링크를 참고하실 수 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.