250x250
반응형
arkhyeon
arkhyeon
arkhyeon
전체 방문자
오늘
어제
  • 분류 전체보기 (88)
    • Spring (5)
    • Java (4)
    • React (25)
      • TypeScript (6)
      • JavaScript (1)
      • Jest (9)
    • NEXT (8)
    • SQL (1)
    • React native (1)
    • CSS (3)
    • Web (1)
    • Git (3)
    • ETC (6)
    • 빅데이터DB (8)
    • Docker (4)
    • Tool (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • javasciprt websocket
  • react loading
  • react spring websocket
  • jest
  • react
  • react jest
  • WSS
  • docker tomcat
  • Spring WebSocket
  • javascript wss
  • kudu
  • react typescript
  • websocket
  • react19
  • node WebSocket
  • websocket server
  • react websocket
  • react usetransition
  • HIVE
  • usetransition

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
arkhyeon

arkhyeon

React

React createPortal(Modal Component)

2023. 7. 11. 16:11
728x90
반응형

# 문제점

모달을 컴포넌트로 만들고 상태 공유를 위해 부모 컴포넌트에 작성 시 문제 야기

  • 상위 컴포넌트의 필요없는 스타일 반영
  • 최상위로 띄우기 위해 무분별한 z-index 사용
//Another.tsx
<ParentDiv>  <--- 해당 부모의 영향을 받으며 z-index가 얼마나 필요한지 생각 필요
	<Modal />
<ParentDiv/>

//Modal.tsx

const Modal = ({ open, handleClose, children }) => {
  const contextValue = { open, handleClose };
  return (
    <ModalContext.Provider value={contextValue}>
      {open && (
            <ModalWrap>
              <ModalBackDrop onClick={handleClose} />
              <ModalContent>{children}</ModalContent>
            </ModalWrap>
        )}
    </ModalContext.Provider>
  );
};

# createPortal(children, domNode, [key])

컴포넌트를 root가 아닌 DOM의 다른 부분에 렌더링

DOM 노드의 물리적 배치만 변경하므로 상위 컴포넌트의 React 구성 요소의 하위 컴포넌트로 구성

그러기에 자식은 부모가 제공하는 컨텍스트, 상태, 이벤트에 액세스 할 수 있다.

const Modal = ({ open, handleClose, children }) => {
  const contextValue = { open, handleClose };
  return (
    <ModalContext.Provider value={contextValue}>
      {open &&
        createPortal(
            <ModalWrap>
              <ModalBackDrop onClick={handleClose} />
              <ModalContent>{children}</ModalContent>
            </ModalWrap>,
          document.body,
        )}
    </ModalContext.Provider>
  );
};

# 매개변수

  • children : React Component
  • domNode : 존재하는 DOM 노드(document.body, document.getElementById()...)
  • key[optional] : Portal Key로 고유한 문자열 또는 숫자 입력

# 주의

  • 이벤트 버블링으로 인해 온전한 포커스 관리 필요
    예를들어 ParentDiv에 onClick 이벤트 작성 시 Modal에서도 작동
...
<ParentDiv onClick={() => alert('Event Bubbling')}>
	createPortal(
		<Modal />
		,document.body
	)
<ParentDiv/>
...
728x90
반응형

'React' 카테고리의 다른 글

Dynamic Import / Lazy Loading - 코드 스플리팅[Code Splitting]  (0) 2023.09.07
Compound Component 패턴  (0) 2023.07.12
React Route dom v6 하위 경로 이동 시 에도 인덱스 NavLink 활성화  (0) 2023.07.04
JEST-REACT18-Vite  (0) 2023.05.22
npm cache clean --force  (0) 2023.01.31
    'React' 카테고리의 다른 글
    • Dynamic Import / Lazy Loading - 코드 스플리팅[Code Splitting]
    • Compound Component 패턴
    • React Route dom v6 하위 경로 이동 시 에도 인덱스 NavLink 활성화
    • JEST-REACT18-Vite
    arkhyeon
    arkhyeon

    티스토리툴바