ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • react정리5 -portal
    카테고리 없음 2022. 7. 16. 15:23

    potal 사용

    index.html

    div overlays부분 추가한다

        <div id="overlays"></div>
        <div id="root"></div>

    Modal.js

    import { Fragment } from "react";
    import ReactDOM from "react-dom";
    
    import classes from "./Modal.module.css";
    //potal 사용 위해 두 개의 컴포넌트 추가
    const Backdrop = (props) => {
      return <div className={classes.backdrop}></div>;
    };
    
    //props.children은 모달이 사용되는 컴포넌트에서모달열기와 닫기 태그사이로 실제로 전달된 콘텐츠가 된다
    const ModalOverlay = (props) => {
      return (
        <div className={classes.modal}>
          <div className={classes.content}>{props.children}</div>
        </div>
      );
    };
    
    //overlay div에 접근하기 위해 생성
    const portalElement = document.getElementById("overlays");
    
    //ReactDOM import후 potal작성
    //각 컴포넌트에 대한 potal생성
    //무엇을, 어디로 potal할지 속성 작성
    //두번째 인자로 potalElement 전달
    const Modal = (props) => {
      return (
        <Fragment>
          {ReactDOM.createPortal(
            <Backdrop onClose={props.onClose} />,
            portalElement
          )}
          {ReactDOM.createPortal(
            <ModalOverlay>{props.children}</ModalOverlay>,
            portalElement
          )}
        </Fragment>
      );
    };
    
    export default Modal;

    cart컴포넌트에서 Modal import 후 div대신 적용해준다 

    사용하려면 App.js에서 Cart import 후 확인

    Cart.js

    return (
        <Modal>
          {cartItems}
          <div>
            <span>Total Amount</span>
            <span>35.62</span>
          </div>
          <div className={classes.actions}>
            <button className={classes["button--alt"]}>Close</button>
            <button className={classes.button}>Order</button>
          </div>
        </Modal>
      );

     

Designed by Tistory.