popover createPortal 방식에서
portal할 요소를 아래처럼 작성하고 있는데
<div id="popoverRoot" /> 저는 이거를 popover를 사용하는 개발자가 신경안쓸 수 있도록
하는 방법이 있지않을까 해서 두 가지 방법을 생각했는데
하나는 useLayoutEffect 내부에서 아래와 같은 로직으로 div요소를 만드는 방법하고,
useLayoutEffect(() => {
if (typeof window !== 'undefined') {
const portalElement = document.getElementById(portalId)
if (!portalElement) {
const newPortalElement = document.createElement('div')
newPortalElement.id = portalId
document.body.appendChild(newPortalElement)
}
}
}, [])
아니면 document.body로 보내는 방법을 생각했는데
return createPortal(
...
,
document.body
)
두 방법 중 어느게 적절한지를 잘 모르겠어서..
혹은 위 방법처럼 했을 때 어떤 문제가 생기는지도 아직 예상이 안되는데 혹시 강사님의 생각은 어떠신지 궁금합니다!
Answer 2
0
<div id="popoverRoot" />
강의에서는 페이지단위로 다른 내용을 소개하기 위해 어쩔 수 없이 페이지 내 컴포넌트별로 따로 넣어줬지만, 실제 서비스에서는 최상단 컴포넌트(_layout.tsx 또는 _app.tsx 등)에 딱 한 번만 넣으면 됩니다. 다른걸 생각하실 이유가 없을 것 같네요.
0
안녕하세요, 인프런 AI 인턴입니다.
oridori2705님께서 질문하신 포털 기법에 대한 두 가지 접근 방식에 대해 설명드리겠습니다.
첫 번째 방법은 useLayoutEffect를 사용하여 필요한 경우에만 DOM에 div 요소를 추가하는 방식입니다. 이 방식은 popover 루트 요소를 특정 portalId를 기준으로 관리할 수 있게 하여, 여러 모달이나 팝오버가 발생할 때 DOM 구조의 혼란을 줄일 수 있습니다. 그러나 DOM 조작을 수작업으로 관리해야 하므로, 요소의 생성 및 제거 시 추가적인 고려사항이 발생할 수 있습니다.
두 번째 방법은 createPortal 함수의 두 번째 인자로 document.body를 직접 사용하는 것입니다. 이 방식은 가장 간편하게 포털을 구현할 수 있는 방법 중 하나로, 재사용이 가능한 모달이나 팝오버 같은 요소를 쉽게 관리할 수 있습니다. 하지만 이 경우, 여러 개의 포털 요소가 있을 때 전역으로 관리되므로, 특정 상황에서 특정 포털을 타겟팅하거나 관리하는 것이 어려울 수 있습니다.
두 방식 모두 각각의 장단점이 있으며, 요구사항과 사용자의 개발 환경에 따라 선택이 달라질 수 있습니다.
- 첫 번째 방법의 장점: 특정 ID로 관리되어 명확한 요소 타겟팅 가능.
- 첫 번째 방법의 단점: 추가 코드가 필요하며, 직관적이지 않을 수 있음.
- 두 번째 방법의 장점: 간결하며, 대부분의 경우에 바로 적용 가능.
- 두 번째 방법의 단점: 특정 포털 요소를 구별하기 어렵고, 전역 관리로 인해 발생 가능한 충돌 관리 필요.
관련 질문으로 createPortal 활용해서 modal 만들 때 활용한 MutationObserver 코드 관련 질문와 비슷한 내용이 있으니 참고해 보시면 좋을 것 같습니다. 해당 질문에서는 createPortal을 활용하여 모달을 관리하는 방법에 대한 토론이 진행되고 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
6장 ORM 에 관하여 질문
0
0
0
안녕하세요 한번 더 문의드립니다.
0
7
0
git 초기설정하고 Next Js 설치하는게 너무 어렵습니다.
0
7
1
커서 색상 및 클로드코드 프롬프트 입력칸 설정 문의
0
9
1
81강 실습 자료 없음
0
8
1
클로드 질문에서 줄 바꿈
0
12
1
2강 퀴즈를 푸려는데 자꾸 수강하지 않은 수업이있는데.. 다들었습니다 ㅜ
0
15
1
서브에이전트 실행중에도 대기해야 할까요?
0
11
1
소스코드 제공여부
0
22
2
궁금했던 질문입니다. 바로 콤마위치 입니다.
0
15
1
선생님 공유해주신 핸드북에 링크가 몇개 잘못되었어요
0
19
2
62강 실습자료가 잘못되었습니다.
0
17
1
제네릭을 사용하실 때 콤마
0
180
2
스낵바를 만들 때 snackBarContext와 snackBarSetContext
0
166
2
snackbar를 createportal를 썻을 때 갯수 조절이 가능한가요?
0
204
1
useCallback, useMemo의 차이에 대해서 궁금합니다.
0
382
1
createPortal 활용해서 modal 만들 때 활용한 MutationObserver 코드 관련 질문
0
370
3
강의자료 (보일러플레이트) 다운로드 관련 질문
0
269
1
모달만드는 방식 질문
0
257
1
캐러셀 동작원리
0
323
2
dropdown 내부에서 data의 타입을 알아야 할까요?
0
216
1
Provider를 외부에 노출하는 것보다 내부 로직으로 숨기는 것은 어떤가요?
0
300
2
keyEventMap를 전역에 구현하신 이유가 궁금합니다!
0
280
2
테일윈드로 포탈로 모달작성시 뒤에 클릭이 안됩니다
1
325
2

