React 컴포넌트에서 첫 렌더링 감지하는 방법

리액트 컴포넌트에서 첫 번째 랜더링을 감지하는 올바른 방법은 무엇인가요? 리액트 컴포넌트를 사용할 때는 때로는 컴포넌트의 첫 번째 랜더링을 감지하는 것이 필요합니다. 이 블로그 포스트에서는 다양한 방법을 탐색하고 각 방법의 장단점을 논의합니다. 또한, 평범한 상태보다 ref를 …

title_thumbnail(React 컴포넌트에서 첫 렌더링 감지하는 방법)

리액트 컴포넌트에서 첫 번째 랜더링을 감지하는 올바른 방법은 무엇인가요?

리액트 컴포넌트를 사용할 때는 때로는 컴포넌트의 첫 번째 랜더링을 감지하는 것이 필요합니다. 이 블로그 포스트에서는 다양한 방법을 탐색하고 각 방법의 장단점을 논의합니다. 또한, 평범한 상태보다 ref를 사용하는 것이 왜 권장되는지에 대해서도 설명할 것입니다.

방법 1: Ref 사용

가장 일반적으로 권장되는 접근 방법은 ref를 사용하여 첫 번째 랜더링을 감지하는 것입니다. 다음 예시처럼 커스텀 훅을 생성하여 이를 구현할 수 있습니다:


export function useDetectFirstRender() {
  const firstRender = useRef(true);

  useEffect(() => {
    firstRender.current = false;
  }, []);

  return firstRender.current;
}

이 접근 방법에서는 렌더링이 처음인지를 나타내기 위해 값을 true로 초기화하는 ref를 생성합니다. 그런 다음, useEffect 훅에서 컴포넌트가 마운트된 후에 ref의 값을 false로 업데이트합니다. 마지막으로, ref의 현재 값을 반환하며, 이 값은 첫 번째 랜더링에서는 true이고 다음 랜더링에서는 false입니다.

방법 2: 상태(State) 사용

다른 접근 방법은 상태를 사용하여 첫 번째 랜더링을 감지하는 것입니다. 다음은 이를 구현한 예시입니다:


export function useDetectFirstRender() {
  const [firstRender, setFirstRender] = useState(true);

  useEffect(() => {
    setFirstRender(false);
  }, []);

  return firstRender;
}

이 접근 방법에서는 true로 초기화된 상태 변수 firstRender를 생성합니다. 그런 다음, useEffect 훅에서 컴포넌트가 마운트된 후에 상태를 false로 업데이트합니다. 마지막으로, firstRender의 값을 반환하며, 이 값은 첫 번째 랜더링에서는 true이고 다음 랜더링에서는 false입니다.

올바른 접근 방법 선택하기

두 가지 접근 방법 모두 첫 번째 랜더링을 감지하는 목표를 달성하지만, 각각 다른 영향을 가지고 있습니다.

ref를 사용한 접근 방식은 useRef를 사용하여 랜더링 간에 지속되는 값을 저장하고자 할 때 선호됩니다. 또한, 렌더링 프로세스 외부에서 명령적으로 값을 사용해야할 때 유용합니다. 그러나 랜더 함수 내에서 값을 직접 사용하는 방법은 제공하지 않습니다.

useState를 사용한 상태 접근 방식은 랜더링을 다시 실행하고 랜더 함수에서 직접 접근 가능한 값을 원할 때 유용합니다. 또한, 간단한 경우에는 이해하고 사용하기 쉽습니다. 그러나 상태 변경은 랜더링을 다시 실행하기 때문에 성능에 영향을 줄 수 있습니다.

결론

결론적으로, ref와 상태 방식 모두 리액트 컴포넌트의 첫 번째 랜더링을 감지하는 데 사용할 수 있습니다. 선택은 애플리케이션의 구체적인 요구 사항에 따라 달라집니다. 값이 랜더링 간에 지속되며 자체적으로 다시 랜더링을 유발하지 않아야 하는 경우, useRef를 사용하는 ref 접근 방식을 선택하세요. 반면, 랜더링을 다시 실행하고 랜더 함수에서 직접 접근 가능한 값이 필요한 경우, useState를 사용하는 상태 접근 방식이 더 적합합니다.

이러한 접근 방식들 간의 차이점과 트레이드오프를 이해하면, 리액트 컴포넌트에서 첫 번째 랜더링을 감지할 때 명확한 결정을 내릴 수 있습니다.

참고 자료 : 

reactjs

Leave a Comment