Design-loving front-end engineer
Ryong
Design-loving front-end engineer
전체 방문자
였늘
μ–΄μ œ
    • Framework
    • React
      • Concept
      • Library
      • Hook
      • Component
      • Test
    • NodeJS
    • Android
      • Concept
      • Code
      • Sunflower
      • Etc
    • Flutter
      • Concept
      • Package
    • Web
    • Web
    • CSS
    • Language
    • JavaScript
    • TypeScript
    • Kotlin
    • Dart
    • Algorithm
    • Data Structure
    • Programmers
    • Management
    • Git
    • Editor
    • VSCode
    • Knowledge
    • Voice
Design-loving front-end engineer

Ryong

React/Component

[ React ] Modal

2022. 8. 2. 13:00

πŸ”΄  Introduction

βšͺ  μ–΄λŠ μœ„μΉ˜μ—μ„œλ‚˜ μ‚¬μš©ν•  수 μžˆλŠ” λͺ¨λ‹¬μ°½μ„ λ§Œλ“œλŠ” ꡬ쑰

 

🟠  Usage

πŸ“„  public/index.html

 
<!-- ··· -->
<body>
  <noscript>You need to enable JavaScript to run this app.</noscript>
  <div id="root"></div>
  <div id="modal"></div>
</body>
<!-- ··· -->

πŸ“„  index.jsx

 
import React from "react";
import ReactDOM from "react-dom/client";
import { Provider } from "react-redux";
import store from "./store";
import App from "./App";
import Modal from "./Modal";

const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
  <>
    <Provider store={store}>
      <Modal />
      <App />
    </Provider>
  </>
);

πŸ“„  store.js

 
import { configureStore } from "@reduxjs/toolkit";
import logger from "redux-logger";
import modalReducer from "./modalSlice";
import ReduxThunk from "redux-thunk";

const store = configureStore({
    reducer: {
        modal: modalReducer,
    },
    middleware: (getDefaultMiddleware) => [
        ...getDefaultMiddleware({ serializableCheck: false }),
        logger,
        ReduxThunk,
    ],
});

export default store;

πŸ“„  modalSlice.js

 
import { createSlice } from "@reduxjs/toolkit";

export const ModalSlice = createSlice({
    name: "modal",
    initialState: {
        show: false,
        type: "",
        props: {},
    },
    reducers: {
        setModal: (state, { payload }) => {
            state.type = payload.modalType;
            state.props = payload.modalProps;
            state.show = true;
        },
        hideModal: (state) => {
            state.show = false;
            state.type = "";
            state.props = {};
        },
    },
});

export const { setModal, hideModal } = ModalSlice.actions;
export default ModalSlice.reducer;

πŸ“„  Modal.jsx

 
import { createPortal } from "react-dom";
import GlobalModal from "./GlobalModal";

const element = document.querySelector("#modal");

const Modal = () => {
    return createPortal(<GlobalModal />, element);
};

export default Modal;

πŸ“„  GlobalModal.jsx

 
import React from "react";
import AlertModal from "./AlertModal";
import TimeoutModal from "./TimeoutModal";
import ToastModal from "./ToastModal";
import { useSelector } from "react-redux";
// πŸ”‘ 직접 λ§Œλ“  μ»€μŠ€ν…€ λͺ¨λ‹¬ μ»΄ν¬λ„ŒνŠΈλ₯Ό μ—°κ²°μ‹œν‚¨λ‹€.
export const MODAL_TYPES = {
    AlertModal: "alert",
    TimeoutModal: "timeout",
    ToastModal : "ToastModal",
};

const MODAL_COMPONENTS = {
    [MODAL_TYPES.AlertModal]: AlertModal,
    [MODAL_TYPES.TimeoutModal]: TimeoutModal,
    [MODAL_TYPES.ToastModal]: ToastModal,
};

const GlobalModal = () => {
    const { show, type, props } = useSelector((state) => state.modal);

    const renderComponent = () => {
        if (!show) {
            return null;
        }
        const ModalComponent = MODAL_COMPONENTS[type];

        return <ModalComponent {...props} />;
    };
    return <>{renderComponent()}</>;
};

export default GlobalModal;

πŸ“„  useModal.js

 
import { useDispatch } from "react-redux";
import { setModal, hideModal } from "./modalSlice";

const useModal = () => {
    const dispatch = useDispatch();

    const showModal = ({ modalType, modalProps }) => {
        dispatch(setModal({ modalType, modalProps }));
    };

    const closeModal = () => {
        dispatch(hideModal());
    };

    return [ showModal, closeModal ];
};

export default useModal;

 

🟑  Reference

 

[ React ] redux

πŸ”΄ Introduction βšͺ μžλ°”μŠ€ν¬λ¦½νŠΈ μƒνƒœκ΄€λ¦¬ 라이브러리 🟠 Official μ‹œμž‘ν•˜κΈ°: Reduxλ₯Ό 배우고 μ‚¬μš©ν•˜κΈ° μœ„ν•œ 자료" data-og-host="ko.redux.js.org" data-og-source-url="https://ko.redux.js.org/introduction/g..

tmdfyd0807.tistory.com

 

 

Usage

 

 

μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
    Design-loving front-end engineer
    Design-loving front-end engineer
    λ””μžμΈμ— 관심이 λ§Žμ€ λͺ¨λ°”일 μ•± μ—”μ§€λ‹ˆμ–΄ Ryongμž…λ‹ˆλ‹€.

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”