Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- Material UI
- react editor #TinyMCE editor
- social login #google login
- 쇼핑몰
- ESLint #Prettier
- useref
- 옵셔널 체이닝
- social login #kakao login
- social login #facebook login
- git flow
- social login #Microsoft login
- redux
- cafe24
- yup
- useState
Archives
- Today
- Total
여행가는개발자
Recoil을 활용하여 팝업 공통화하기 본문
728x90
반응형
기존에 코드를 작성할때 컴포넌트마다 팝업을 만들거나 index.tsx에 팝업을 만들어 props로 보내는 작업을 종종했었는데 상태관리를 적용해놓고 왜 공통화를 못했을까라는 생각이 들어서 이번 기회에 공통화 작업을 하면서 문서로 정리해보기로 한다.
예시로 만드는 팝업은 4개로 간주한다.
먼저 전역에 GlobalMoal를 만든다.
GlobalModal.tsx
export const MODAL_TYPES = {
CouponModal: 'CouponModal',
OptionModal: 'OptionModal',
OrderDelConfirm: 'OrderDelConfirm',
OrderModal: 'OrderModal',
} as const
const MODAL_COMPONENTS: any = {
[MODAL_TYPES.CouponModal]: CouponModal,
[MODAL_TYPES.OptionModal]: OptionModal,
[MODAL_TYPES.OrderDelConfirm]: OrderDelConfirm,
[MODAL_TYPES.OrderModal]: OrderModal,
}
const GlobalModal = () => {
const { modalType, modalProps } = useRecoilState(modalState)[0] || {}
const renderComponent = () => {
if (!modalType) {
return null
}
const ModalComponent = MODAL_COMPONENTS[modalType]
return <ModalComponent {...modalProps} />
}
return <>{renderComponent()}</>
}
팝업을 호출할때 _index.tsx에서 선언한 GlobalMoal에서 팝업을 호출할수 있게 작업 해준다.
store / atoms / modal.ts
const { CouponModal, OptionModal, OrderDelConfirm, OrderModal } = MODAL_TYPES
export interface CouponModalType {
modalType: typeof CouponModal
modalProps: CouponModalProps
}
export interface OptionModalType {
modalType: typeof OptionModal
modalProps: OptionModalProps
}
export interface OrderDelConfirmType {
modalType: typeof OrderDelConfirm
modalProps: OrderDelConfirmProps
}
export interface OrderModalType {
modalType: typeof OrderModal
modalProps: OrderModalProps
}
export type ModalType =
| CouponModalType
| OptionModalType
| OrderDelConfirmType
| OrderModalType
export const modalState = atom<ModalType | null>({
key: 'modalState',
default: null,
})
그다음 store단에서 모달.ts을 선언하여 각 팝업의 타입과 Props를 recoil로 상태를 관리하게 만든다.
useModal.tx
const [modal, setModal] = useRecoilState(modalState)
const showModal = (modalData: ModalType) => {
setModal(modalData)
}
const hideModal = () => {
setModal(null)
}
return {
modal,
setModal,
showModal,
hideModal,
}
다음으로는 useModal을 hooks으로 만들어서 showModal과 hideModal을 함수를 만들고 showModal으로 모달 타입과 Props를 넣어 호출하고 hideModal으로 팝업을 닫게 만들었습니다.
const { showModal } = useModal()
const OptionModalOpen = () => {
showModal({
modalType: 'OptionModal',
modalProps: {
option: options,
open: true,
seleteProduct: seleteProduct,
},
})
}
팝업을 호출할때는 다음과 같이 코드를 넣고 Props를 활용하여 팝업 내용이나 다양한 상태를 삽입 할수 있습니다.
728x90
반응형
'React' 카테고리의 다른 글
Spread 연산자와 Rest 연산자 (0) | 2023.11.14 |
---|---|
에디터 사용기 (tinymce-react) (0) | 2023.11.07 |
Recoil (1) | 2023.10.10 |
Json-server (0) | 2023.09.15 |
Typescript vs Javascript (0) | 2023.09.15 |