inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

코어 프런트엔드 UI - Part 2

기본환경세팅 (2/2) 컴포넌트 작성

테일윈드로 포탈로 모달작성시 뒤에 클릭이 안됩니다

해결된 질문

332

냠냠굿

작성한 질문수 36

1

<div
      id='modalRoot'
      ref={ref}
      className='fixed inset-0 z-100 flex flex-col items-center justify-center'
     
    >
      {children}
    </div>

테일 윈드로 선생님 모달 포탈로만드는것 해보고있는데.
뒤에 클릭이 안되요

pointer-events-none 쓰지말고 하는법이 없을까요?!

일단은
아래처럼 쓰고잇긴한데 ㅠㅠ 먼가 ...

'use client';
import React, { useEffect, useRef } from 'react';
import { useModalStore } from '@/shared/models/modal/stores/modalStore';

const mutationObserverOption: MutationObserverInit = {
  childList: true,
  subtree: false,
};

/**
 * 모달 컴포넌트를 렌더링하기 위한 전역 컨테이너 프로바이더입니다.
 * 모달이 열려 있을 때 body 요소에 'no-scroll' 클래스를 토글하여 스크롤을 비활성화합니다.
 *
 * @param {React.ReactNode} children - 모달 루트 내부에 렌더링할 자식 요소
 * @returns {JSX.Element} 모달 루트 프로바이더
 */
const ModalRootProvider: React.FC<{ children: React.ReactNode }> = ({
  children,
}) => {
  const ref = useRef<HTMLDivElement>(null);
  const { openedModalTypes, closeModal } = useModalStore();
  // const isModalOpen = openedModalTypes.length > 0;

  useEffect(() => {
    let observer: MutationObserver;

    /**
     * MutationObserver를 사용하여 모달 루트 컨테이너의 자식 요소 변경을 감지합니다.
     * 모달이 열려 있는 경우 body 요소에 'no-scroll' 클래스를 추가하고, 모달이 닫혀 있는 경우 클래스를 제거합니다.
     */
    if (ref.current) {
      observer = new MutationObserver(() => {
        const size = ref.current?.childNodes.length || 0;
        document.body.classList.toggle('no-scroll', size > 0);

        ref.current!.classList.toggle('bg-black/50', size > 0);
        ref.current!.style.pointerEvents = size > 0 ? 'auto' : 'none';
      });
      observer.observe(ref.current, mutationObserverOption);
    }

    // 컴포넌트 언마운트 시 MutationObserver 연결을 해제합니다.
    return () => {
      observer.disconnect();
    };
  }, []);

  return (
    <div
      id='modalRoot'
      ref={ref}
      className='fixed inset-0 z-100 flex flex-col items-center justify-center pointer-events-none'
      // onClick={handleOutsideClick}
    >
      {children}
    </div>
  );
};

export default ModalRootProvider;

react typescript dom ui vanilla-js

답변 2

1

정재남

  1. modalRoot는 z-index를 확보하기 위해 html body의 가장 마지막에 위치시키는 것이 바람직합니다.

<body>
  <ModalProvider />
  {children}
  <ModalRoot />
</body>
  1. modalRoot에는 스타일이 불필요합니다.

    <div id="modalRoot" ref={ref} />

1

냠냠굿

선생님 정말 도움이되었어요 정말감사합니다!
선생님 다른강의도 다구매할게요 책은 예전에 구매했엇네요

1

정재남

깃헙에 올려주시고 링크 공유해 주세요. 저도 돌려보고 말씀드릴게요.

0

냠냠굿



페이지는 /result/0/0 이고 모달버튼 누르면

ㄱ. 일부컴퍼넌트가 블러가안됨
ㄴ. pointer-events-none를 안하면 클릭이 안됩니다 ㅠ

챌린지 시작일 문의

0

14

0

17강 강의에 목데이터 첨부파일이 없습니다.

1

12

1

줄바꿈 시 \ 필수인가요?

0

15

2

2605 이후 최신 클로드코드 강의 추가 부탁드립니다.

0

12

2

커리큘럼 문서 제공받을 수 있을까요?

0

19

1

ThemeProvider를 이용해서 NextThemeProvider를 따로 생성하여 Layout.tsx에 적용하는 이유는 뭘까요?

0

13

1

인덱스드 엑세스타입 실무질문

0

13

2

mission 09-01 을 수행할 수 없어요

0

20

1

outputStyle 설정하는데 어디서 문제일까요?

0

21

3

test.txt파일 삭제시 rm명령어이니 클로드의 질문이 있어야 한다고 하셨는데

0

13

2

검은화면

0

23

3

강의교환링크안열려요.....

0

23

2

제네릭을 사용하실 때 콤마

0

186

2

popover createPortal 방식에서

0

177

2

스낵바를 만들 때 snackBarContext와 snackBarSetContext

0

173

2

snackbar를 createportal를 썻을 때 갯수 조절이 가능한가요?

0

209

1

useCallback, useMemo의 차이에 대해서 궁금합니다.

0

394

1

createPortal 활용해서 modal 만들 때 활용한 MutationObserver 코드 관련 질문

0

384

3

강의자료 (보일러플레이트) 다운로드 관련 질문

0

280

1

모달만드는 방식 질문

0

263

1

캐러셀 동작원리

0

329

2

dropdown 내부에서 data의 타입을 알아야 할까요?

0

222

1

Provider를 외부에 노출하는 것보다 내부 로직으로 숨기는 것은 어떤가요?

0

306

2

keyEventMap를 전역에 구현하신 이유가 궁금합니다!

0

291

2