Repository navigation
Replies: 5 comments 1 reply
|
아니 왜 이제 보여주셨죠 우선 저의 소견을 살짝 말씀드리자면,,, const modal = (title: string, message: string, isShow: boolean, onDone?: () => void, onCancel?: () => void) => {
setTitle(title);
setMessage(message);
setShowModal(isShow);
setHandleDone(() => onDone);
setHandleCancel(() => onCancel);
};Parameter가 2-3개 이상으로 넘어가게 된다면 순서에 맞게 Parameter를 넘겨야만 하는 셀프 가두리 양식이 생깁니다 😅 type ModalOptions = {
title: string;
message: string;
isShow: boolean;
onDone?: () => void;
onCancel?: () => void;
};
const modal = ({
title,
message,
isShow,
onDone,
onCancel
}: ModalOptions) => {
setTitle(title);
setMessage(message);
setShowModal(isShow);
setHandleDone(() => onDone);
setHandleCancel(() => onCancel);
};// 사용
modal({
title: "알림",
message: "작업이 완료되었습니다.",
isShow: true
});이런식으로 바꾸면 좋아보입니다! |
|
추천 ) react Potal 이라고, 모달처럼 독립된 DOM 요소를 만들 때 쓰는 것이 있습니다. (링크 참조)
프론트엔드 시작하신지 얼마 안되었는데 이 정도 경지에 오르시다니... 대단하십니다! // useModal 정의
export const useModal = () => {
const [modalData, setModalData] = useRecoilState(DefaultModalStore);
const reset = useResetRecoilState(DefaultModalStore);
const closeModal = useCallback(
(onClick?: () => void) =>
setModalData((prev) => {
return {
...prev,
show: false,
onClick,
};
}),
[setModalData],
);
const showModal = useCallback(
({ icon, content, content2, modalId, onClick }: ShowModalType) => {
setModalData({
icon: icon,
show: true,
content: content,
content2: content2,
modalId: modalId,
onClick: () => {
onClick && onClick();
reset();
},
});
},
[setModalData],
);
return {
modalData,
setModalData,
closeModal,
showModal,
};
};// 실제 사용법
useEffect(() => {
if (candidateError) {
showModal({
content: currentPageMessages[getErrorContent(candidateError)],
modalId: 'CANDIDATE_ERROR',
onClick: async () => {
await logoutClick();
},
});
}
}, [candidateError]); |
|
확인/취소 버튼 구성이 있는 모달은 Confirm으로 네이밍을 많이 하는 것 같아요. 유민님이 보여주신 예가 응시 쪽 모달에서도 쓰이는 모달인데요. 두분께서 구조에 관한 이야기를 하셨으니, 저는 좀 지엽적으로 가보자면,
이와 비슷하게 |
|
앞에 분들의 매우 좋은 의견을 주셨네요!! 저도 지엽적으로 들어간면 onHide={handleCancel ? handleCancel : handleDone}요 부분을 따로 변수로 꺼낸다면 명확하게 사용이 가능하고 유지 보수에 있어 좋다고 생각합니다! 근데 역시 짬이 있으니까 코드가 매우 깔끔하네유,.., |
|
리액트를 처음 사용해보시는 것인데도 합성 컴포넌트로 엄청 깔끔하게 작성하셨군요.. 대박 👍👍 저는 모달을 관리하는 데 있어서 중요 포인트는 2가지라는 생각이 들었는데요..!
먼저 상태를 어떻게 관리해야할 지가 고민이 되는데, Chakra UI에서는 useDisclosure 라는 훅으로 오버레이의 열고 닫힘과 관련된 로직을 추상화하여 관리하더라구요..! 혹은 toss/slash 라이브러리 중 useOverlay나 최근 업데이트 된 overlay-kit 에서는 오버레이 요소에 대한 상태를 내부적으로 핸들링해줌으로써 사용하는 개발자는 표현해야 하는 UI에만 집중할 수 있도록 제공하고 있더라구요! 아직 깊게 파보지 못한 부분이어서, 요런 것들도 알아가고 싶다는 생각이 들어요 😊 References |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
제가 타입스크립트도,, 리액트도 처음 써보는데 처음 만든 훅 구경해보세요 🙀
부트스트랩 모달으로 커스텀모달 컴포넌트를 만들고 useModal 을 만들어보았습니다
CustomModal.tsx
handleCancel이 없으면[확인] 버튼만 있는 모달이고
handleCancel이 있으면[취소] [확인] 버튼이 있는 모달입니다.
useModal.tsx
사용할때는 따로
handleModalDone를 만든후아래와 같이 사용했습니다
🐥 좋은 리팩토링 의견 부탁드립니다
All reactions