forwardRef와 useRef를 활용하여 modal 제어하기

2024. 11. 11. 15:08·⚛️ React

참조(ref)란?

참조(ref)는 React에서 DOM 요소나 클래스형 컴포넌트에 접근하기 위해 사용됩니다.
예를 들어, input 요소에 포커스를 맞추거나, dialog 같은 내장 DOM 요소의 메소드를 호출할 때 사용합니다.

컴포넌트 구조

  • TimerChallenge: 타이머를 시작하고, 만료되었을 때 모달 창을 띄우는 역할을 합니다.
  • ResultModal: 타이머가 끝났을 때 사용자에게 결과를 보여주는 모달 창입니다.

1. useRef로 참조 만들기

TimerChallenge 컴포넌트에서는 useRef를 사용해 두 개의 참조를 생성합니다:

  • timer는 setTimeout으로 설정한 타이머를 참조합니다.
  • dialog는 ResultModal의 dialog 요소를 참조합니다.
const timer = useRef();
const dialog = useRef();
  • useRef는 current라는 속성을 가지는 객체를 반환하며, 이 current를 통해 우리가 참조한 DOM 요소에 접근할 수 있습니다.

2. 타이머 시작 및 만료 처리

  • 사용자가 타이머를 시작하면 handleStart 함수가 호출됩니다.
  • setTimeout을 사용해 설정된 시간(targetTime) 후에 특정 작업을 실행하도록 합니다.
  • 타이머가 만료되면 setTimerExpired(true)를 호출해 상태를 갱신하고, dialog.current.showModal()을 호출해 모달 창을 보여줍니다.
function handleStart(){
    timer.current = setTimeout(() => {
      setTimerExpired(true);
      dialog.current.showModal();
      //dialog 요소(HTML의 `<dialog>` 태그)를 브라우저에 표시하는 메서드
    }, targetTime * 1000);
    setTimerStarted(true);
}

3. ResultModal에 참조 전달

  • TimerChallenge 컴포넌트에서 ResultModal 컴포넌트를 렌더링할 때, ref 속성으로 dialog 참조를 전달합니다.
<ResultModal ref={dialog} targetTime={targetTime} result="lost"/>

ref={dialog}는 ResultModal 컴포넌트가 dialog라는 참조를 받을 수 있게 해준다

4. forwardRef를 사용한 참조 전달

  • 일반적으로 React에서 만든 컴포넌트는 ref를 직접 받을 수 없습니다.
    그래서 forwardRef라는 함수를 사용해 참조를 전달할 수 있게 만들어야 합니다.
  • forwardRef는 참조를 컴포넌트에 전달하는 역할을 합니다.
  • ResultModal 컴포넌트를 forwardRef로 감싸서 참조를 전달받고, 그 참조를 dialog DOM 요소에 연결합니다.
const ResultModal = forwardRef(function ResultModal({ result, targetTime }, ref) {
    return (
        <dialog ref={ref} className="result-modal">
            <h2>You {result}</h2>
            <p>The target time was <strong>{targetTime}</strong></p>
            <form method="dialog">
                <button>Close</button>
            </form>
        </dialog>
    );
});

forwardRef는 ResultModal 컴포넌트를 감싸고 있으며, 이를 통해 부모 컴포넌트(TimerChallenge)에서 전달된 ref를 받아서 <dialog> 요소에 연결합니다.

전체 흐름

  • 1단계: TimerChallenge 컴포넌트에서 타이머를 시작합니다.
  • 2단계: 타이머가 설정된 시간 후에 만료되면 setTimeout이 만료됩니다.
  • 3단계: 타이머가 만료되면 dialog.current.showModal()을 호출하여 ResultModal의 모달 창을 브라우저에 표시합니다.
  • 4단계: ResultModal 컴포넌트는 forwardRef를 통해 전달받은 ref를 사용하여 실제 DOM 요소(dialog)를 조작합니다.

중요 개념

참조(ref): 특정 DOM 요소에 직접 접근하고 조작할 수 있도록 해주는 도구입니다.
useRef 훅: 참조를 생성할 때 사용하며, DOM 요소에 접근하기 위해 사용됩니다.
forwardRef: 참조를 컴포넌트 간에 전달할 수 있도록 해주는 함수입니다.
dialog.current.showModal(): <dialog> DOM 요소를 화면에 표시하기 위해 사용되는 메서드입니다.

'⚛️ React' 카테고리의 다른 글

Virtual DOM  (1) 2024.11.11
React - StrictMode  (0) 2024.11.11
쿼리 비활성화 (Tanstack-Query)  (0) 2024.11.11
useRef 훅 : 효율적인 컴포넌트 관리  (0) 2024.11.11
memo,useCallback 으로 불필요한 렌더링 줄이기  (0) 2024.11.11
'⚛️ React' 카테고리의 다른 글
  • React - StrictMode
  • 쿼리 비활성화 (Tanstack-Query)
  • useRef 훅 : 효율적인 컴포넌트 관리
  • memo,useCallback 으로 불필요한 렌더링 줄이기
gprorogpfus
gprorogpfus
:- >
  • gprorogpfus
    gpfusdldks
    gprorogpfus
  • 전체
    오늘
    어제
    • 분류 전체보기 (55)
      • 🎭JavaScript (2)
      • 👚 CSS (1)
      • ⚛️ React (13)
      • 🌃 Next.js (5)
        • 🔜 next.js-study (3)
      • 🥏TypeScript (10)
      • 🏴알고리즘 (2)
      • 🌴트러블슈팅 (3)
      • ⛲ 프로젝트 (6)
        • 👖gproro-shop-app (8)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    react
    TypeScript
    GIT
    Redux
    JavaScript
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
gprorogpfus
forwardRef와 useRef를 활용하여 modal 제어하기
상단으로

티스토리툴바