Portal

2022. 7. 6. 23:14·프론트엔드/React

Portal은 부모 컴포넌트의 DOM 계층 구조 바깥에 있는 DOM 노드로 자식을 렌더링하는 최고의 방법을 제공한다. - 공식문서

 

활용

모달을 구현할 때 유용하게 활용할 수 있다.

모달을 구현 시 제일 까다로운 부분은 z-index 설정이다. z-index는 부모 안에서만 적용되기 때문에 다른 컴포넌트가 z-index가 더 높은 경우 모달이 해당 컴포넌트에 가린다거나 하는 문제가 발생한다.

그렇기 때문에 최상위 컴포넌트에 조건부 렌더링으로 모달을 달아놓고 redux로 해당 상태를 관리해서 모달을 구현하는 식으로 사용을 했었다.

<TopComponent>
    {...생략}
    {isModalOpen && <Modal/>}
</TopComponent>

하지만 이렇게 구현했을 때는 많은 문제점이 있다.

1) 모달에 정보를 줄 때 redux를 활용함 - 이는 redux의 본래 취지(많은 컴포넌트에서 사용하는 애들을 공통으로 관리)에 맞지 않고 redux에 저장하는 상태들이 필요 이상으로 많아진다.

2) 모달을 띄우는 부분과 실제 모달이 보여지는 곳이 서로 다른 곳에 있어서 수정할 때도 번거롭고, 좋지 않다.

React의 Portal을 활용하면 이러한 문제점들이 해결된다.

<JasikComponent>
	<Button onClick={setIsModalOpen(true)}/>
    {isModalOpen && <Modal props={...자식에 있는 상태,프롭들}/>}
</JasikComponent>

const Modal = (props) => {
	return ReactDOM.createPortal(
    	<div {...생략}>{...생략}</div>,
        body // 반드시 DOM 노드여야함
    )
}

이런 식으로 부모에 있는 상태,프롭들을 내려줘서 활용할 수 있고 기존 컴포넌트들과 똑같이 상태,프롭에 따른 업데이트가 되서 훨씬 다루기 편해진다.

또 모달을 부르는 곳과 보여지는 곳 (코드상) 이 같아져서 수정할 때도 훨씬 편하다.

 

단점

1. 반드시 DOM노드에만 활용할 수 있다. 다른 리액트 컴포넌트에는 삽입할 수가 없다.

2. 그래서 활용할 곳이 많지는 않다. 모달에 활용할 수 있고, 기본적으로 canvas 가 화면에 처음부터 박혀 있는 서비스 ( ex: 그림 그리기 앱) 같은 곳에서도 활용할 수 있을 것 같다. 

 

저작자표시 (새창열림)

'프론트엔드 > React' 카테고리의 다른 글

리액트 프로젝트 폴더 구조  (0) 2023.04.08
useIntersectionObserverRef 커스텀 훅 만들기  (1) 2023.02.16
커스텀 훅 적용하기 - 팝업(모달)  (0) 2022.07.02
HOC  (1) 2022.06.04
useCallback 과 useMemo  (0) 2022.06.04
'프론트엔드/React' 카테고리의 다른 글
  • 리액트 프로젝트 폴더 구조
  • useIntersectionObserverRef 커스텀 훅 만들기
  • 커스텀 훅 적용하기 - 팝업(모달)
  • HOC
정현우12
정현우12
  • 정현우12
    정현우의 개발 블로그
    정현우12
  • 전체
    오늘
    어제
    • 분류 전체보기 (80)
      • 프론트엔드 (56)
        • JavaScript, TypeScript (12)
        • 스타일링 (1)
        • React (13)
        • Next.js (4)
        • 개발 환경 (9)
        • 테스트 (3)
        • 성능 최적화 (11)
        • 함수형 프로그래밍 (2)
        • 구조 (1)
      • 프로젝트 회고 (24)
        • 이미지편집기 개발 (7)
        • 엑셀 다운로드, 업로드 공통 모듈 개발 (4)
        • 사용자 매뉴얼 사이트 개발 (3)
        • 통계자동화 솔루션 개발 (1)
        • 엑셀 편집기 개발 (5)
        • API 플랫폼 (1)
        • 콜센터 솔루션 OB 캠페인 (1)
        • AI 스튜디오 (1)
        • AI 워크플로우 저작도구 (1)
      • 백엔드 (0)
  • 블로그 메뉴

    • 홈
    • 포트폴리오
    • 태그
  • 인기 글

  • 태그

    회고
    성능 최적화
    JavaScript
    렌더링 성능 최적화
    webpack
    웹 성능 최적화
    useReducer
    Github Actions
    React
    Next.js
    사용자 매뉴얼 사이트
    커스텀 훅
    로딩 성능 최적화
    memoization
    TypeScript
    엑셀
    이미지 편집기
    엑셀 에디터
    라이브러리 선정
    React-boilerplate
  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
정현우12
Portal
상단으로

티스토리툴바