문제
expo sdk 업그레이드 하기 전에 잘 되던 바텀시트와 모달이 업데이트 후에 안나오는 상황이 발생.
const [modalOpen, setModalOpen] = useState(false);
const [reportOpen, setReportOpen] = useState(false);
//리포트 모달 나오는 클릭
const handleReportClick = () => {
setModalOpen(false); //상세 바텀시트 옵션
setReportOpen(true); // 신고 바텀시트 열기
};
//유저 차단 모달 나오는 클릭
const handleBlockedClick = () => {
const confirmAction = async () => {
try {
await fetchBoardHide(boardId); // 차단 API 호출
router.replace(`/board`);
} catch (e) {
showModalHandler("alert", "다시 시도해 주세요");
} finally {
setModalOpen(false); // 모달 닫기
}
};
setModalOpen(false);
showModalHandler("choice", "게시글을 차단하시겠어요?", confirmAction);
};
이제 이게 문제의 함수였는데, 빌드하고나서 환경이 달라진건지, sdk업데이트 하고나서 달라진건지는 잘 모르겠어요,
아무튼 모달이 안나옴,
modalOpen은 바텀시트 열리는 state임, 그래서 해당 버튼 누르면 바텀시트 열리고 그 안에 차단과 신고가 있음,
그리고 신고 누르면 바텀시트 닫히면서 신고모달이 열리는거임,
안나오길래 콘솔 찍어봤는데,
// 1차
// 처음 상세페이지 들어왔을때
// Detailpage bottommodalOpen===> false
// Detailpage reportmodalOpen===> false
// commonModalOpen open ==> false
// 2차.
// 상세에서 바텀시트 여는 버튼 눌렀을 때
// Detailpage bottommodalOpen===> true
// Detailpage reportmodalOpen===> false
// commonModalOpen open ==> false
// 3차
// 바텀시트 안에 있는 신고 눌렀을때
// Detailpage bottommodalOpen===> false
// Detailpage reportmodalOpen===> true
// commonModalOpen open ==> false
// 바텀시트는 닫히고 신고 모달은 안나옴, 화면 뒤로갔다 들어와도 안나옴
이런 콘솔이 나왔음, 그니까 상태변화는 잘 되고 있는거라 문제가 없었음,
심지어 뒤로갔다 해당 페이지로 다시 돌아오면 그때서야 모달이 나왔음,
모달 클릭 함수에서 setModalOpen(false); 을 주석처리 하니까 그때서야 신고 모달이 나왔다.
setModalOpen(false); 호출이 setReportOpen(true);와 상호 작용하여 ReportModal이 나타나는 것을 방해하고 있다는 것!!
리액트에선 상태 업데이트는 비동기로 처리 되는데 그걸 생각 못했다. 성능을 위해 여러 상태 업데이트를 한 번의 렌더링으로 배치, React가 이를 하나의 업데이트로 처리 하기 때문에 동시에 여러 개의 setState를 호출해서 상태가 겹친 듯 싶다.
근데 왜 이전에는 동작이 잘 된건지 모르겠다.. 일단 이유는 나중에 찾아보기로 하고
그래서 settimeout을 걸어보니 클릭함수가 동작이 잘 된다 . 2시간동안 삽질한 결과, 이유를 다른 곳에서 찾고 있었음.
const handleReportClick = () => {
setModalOpen(false); // 상세 바텀시트 닫기
setTimeout(() => {
setReportOpen(true); // 신고 바텀시트 열기
}, 500); // 또는 약간의 지연 시간 (예: 100ms)
};
일단 1차해결,
근데 setimeout만 사용할 수 없으니 다음 대안을 찾아봐야함.
상태를 동기처리 하려면 함수형 업데이트를 사용하면 됨, => 상태를 동기적으로 처리하게 됨,
상태를 업데이트할 때, 현재 상태 값을 안전하게 참조할 수 있도록 업데이트 함수를 인자로 전달하는 방식입니다. 주로 이전 상태 값에 의존해서 새로운 상태를 계산해야 하는 경우
일단 해보고 다시 씀,
'프로젝트 답지' 카테고리의 다른 글
[Dap JI ] react-native-seoul/kakao-login사용해서 카카오 로그인 (0) | 2024.12.03 |
---|---|
[Dap JI ] expo expo-apple-authentication 사용해서 애플 로그인 (3) | 2024.12.01 |
[Dap JI ] expo go가 아닌 실제 배포 환경에서 적용해보기, (0) | 2024.11.27 |
[Dap JI ] expo 스텍관리문제 (1) | 2024.11.21 |
[Dap JI ] 스토어 승인 요소 (3) | 2024.11.20 |