여러 프로젝트에서 Modal을 사용할 일이 많아 loplat UI에서 컴포넌트를 제공해주고자 한다.
렌더링부에서 container DOM과 children content만 선언하여 쉽게 react portal 기능을 사용할 수 있도록 하고자 한다.
// 원하는 형태
<Portal container={ref}>
<div>children</div>
</Portal>
<Modal open={open}>
<div>children</div>
</Modal>
해결 과정
먼저 container와 chlidren을 prop으로 받아 createPortal을 실행하는 Portal 컴포넌트를 만든다.
import React from 'react';
import ReactDOM from 'react-dom';
export interface PortalProps {
children: React.ReactElement;
container: Element | null;
}
export function Portal({ children, container }: PortalProps): React.ReactPortal | null {
if (!container) return null;
return ReactDOM.createPortal(children, container);
}
Modal 컴포넌트는 loplat UI 자체적으로 동적 container를 만들어주는 것이 사용자 입장에서 편하다고 판단했다. 이 때, useRef를 사용하면 리렌더링이 일어나지 않아 버그가 발생할 수 있으므로 setState와 DOM API(document.getElementById)를 사용하였다.