useFirstRender

Introduction

useIsFirstRender 훅을 사용하는 주된 이유는 컴포넌트의 첫 번째 렌더링에만 수행되어야 하는 작업을 효율적으로 처리하기 위해서입니다.

React 컴포넌트의 렌더링 사이클 중에서 첫 번째 렌더링과 이후의 렌더링은 다를 수 있습니다. 예를 들어, 초기 데이터 로딩, 외부 리소스에 대한 요청, 혹은 특정한 설정 등은 주로 컴포넌트가 처음 마운트될 때만 수행되어야 하는 작업입니다.

이런 경우에 useIsFirstRender 훅을 사용하면 조건부 렌더링을 통해 첫 번째 렌더링에만 특정 코드 블록을 실행할 수 있습니다. 이는 불필요한 작업을 줄이고 성능을 향상시킬 수 있습니다.

예를 들어, 네트워크 요청이나 초기화 작업은 첫 번째 렌더링에서만 수행되어야 하므로, 이러한 작업을 조건부로 실행할 수 있어 유용합니다. 또한, 이는 컴포넌트의 로직을 더 깔끔하게 구성할 수 있게 도와줍니다.

Example

import React, { useEffect } from "react";

const MyComponent = () => {
  // 커스텀 훅을 사용하여 첫 번째 렌더링인지 여부를 확인합니다.
  const isFirstRender = useIsFirstRender();

  // useEffect는 모든 렌더링에서 실행되지만, isFirstRender 플래그를 사용하여
  // 첫 번째 렌더링일 때만 코드를 실행할 수 있습니다.
  useEffect(() => {
    if (isFirstRender) {
      console.log("이 코드는 첫 번째 렌더링에서만 실행됩니다!");
      // 첫 번째 렌더링에만 수행되어야 하는 작업을 여기에 수행하세요.
    } else {
      console.log("이 코드는 두 번째 이후 렌더링에서 실행됩니다!");
      // 두 번째 이후 렌더링에 수행되어야 하는 작업을 여기에 수행하세요.
    }

    // 모든 렌더링에서 실행되어야 하는 정리 작업이나 작업을 여기에 수행하세요.

    // eslint-disable-next-line react-hooks/exhaustive-deps
  }, []); // 빈 의존성 배열은 이 useEffect가 마운트와 언마운트 때만 실행되도록 보장합니다.

  // 나머지 컴포넌트 로직은 여기에 작성하세요.

  return (
    <div>
      {/* 컴포넌트의 JSX 부분 */}
    </div>
  );
};

export default MyComponent;

useEffect 훅은 모든 렌더링에서 실행되지만, useIsFirstRender 훅이 반환한 isFirstRender 플래그를 사용하여 첫 번째 렌더링인지 여부에 따라 조건부로 코드를 실행합니다.

Hook

import { useRef } from "react";

/**
 * 컴포넌트의 처음 랜더링 여부를 나타내기 위한 커스텀 훅입니다.
 *
 * 1. 첫 마운트시 (isFirstMount.current === true)
 * isFirstMount는 useRef를 통해 생성된 객체로 초깃값이 true
 * 함수가 처음 호출 시 isFirstMount.current가 true 이므로, 조건문이 실행
 * isFirstMount.current를 false로 변경하고 true로 반환
 *
 * 2. 이후 랜더링 때 (isFirstMount.current === false)
 * isFirstMount.current가 이전에 false로 변경이 되었기 때문에, 조건문이 실행되지 않음
 * 즉, isFirstMount.current의 현재값인 false가 반환이됨.
 *
 * 특정 코드 블록을 실행하고 처음 랜더링떄만 부수 작업할 수 있는 효과를 줄 수 있다.
 * @returns {boolean}
 */
export default function useIsFirstRender(): boolean {
  // useRef를 사용하여 컴포넌트가 처음 렌더링되었는지 추적하는 ref 객체를 생성합니다.
  const isFirstMount = useRef(true);

  // 첫 번째 마운트시
  if (isFirstMount.current) {
    // isFirstMount를 false로 변경하고, true를 반환합니다.
    isFirstMount.current = false;
    return true;
  }

  // 현재 렌더링이 처음이 아니면 false를 반환합니다.
  return isFirstMount.current;
}

Last updated