개발일지

useRef 본문

리액트 공식문서 스터디

useRef

박수미/ 2024. 5. 30. 17:11

📌 useContext란?

useRef는 렌더링에 필요하지 않은 값을 참조할 수 있는 React훅입니다.

const ref = useRef(initialValue)

📌 useContext

컴포넌트 최상위 레벨에서 useRef를 호출하여 ref를 선언합니다.

import { useRef } from 'react';

function MyComponent() {
  const intervalRef = useRef(0);
  const inputRef = useRef(null);
  // ...

 

📍 매개변수

  • initialValue: ref 객체의 current프로퍼티 초기 설정값입니다. 여기에는 어떤 유형의 값이든 지정할 수 있습니다. 이 인자는 초기 렌더링 이후부터는 무시됩니다.

📍 반환값

useRef는 단일 프로퍼티를 가진 객체를 반환합니다:

- current: 처음에는 전달한 initialValue로 설정됩니다. 나중에 다른 값으로 바꿀 수 있습니다. ref객체를 JSX노드의 ref속성으로 React는 current 프로퍼티를 설정합니다.

다음 렌더링에서 useRef는 동일한 객체를 반환합니다.

 

📍 주의사항

  • ref.current 프로퍼티는 state와 달리 변이할 수 있습니다. 그러나 렌더링에 사용되는 객체(예: state의 일부)를 포함하는 경우 해당 객체를 변이 해서는 안됩니다.
  • ref.current 프로퍼티를 변경해도 React는 컴포넌트를 다시 렌더링라지 않습니다. ref는 일반 JavaScript객체이기 때문에 React는 사용자가 언제 변경했는지 알지 못합니다.
  • 초기화를 제외하고는 렌더링 중에 ref.current를 쓰거나 읽지 마세요. 이랗게 하면 컴포넌트의 동작을 예측할 수 없게 됩니다.

📌 사용방법

1️⃣ ref로 값 참조하기

컴포넌트의 최상위 레벨에서 useRef를 호출하여 하나 이상의 ref를 선언합니다.

import { useRef } from 'react';

function Stopwatch() {
  const intervalRef = useRef(0);
  // ...

useRef는 처음에 제공한 초기값으로 설정된 단일 current 프로퍼티가 있는 ref객체를 반환합니다.

다음렌더링에서 useRef는 동일한 객체를 반환합니다. 정보를 저장하고 나중에 읽을 수 있도록 current 속성을 변경할 수 있습니다. state가 떠오를 수 있지만, 둘 사이에는 중요한 차이점이 있습니다.

 

ref를 변경해도 리렌더링을 촉발하지 않습니다. 즉 ref는 컴포넌트의 시각적 출력에 영향을 미치지 않는 정보를 저장하는데 적합합니다.

 

ref를 사용하면 다음을 보장합니다:

  1. (렌더링할 때마다 재설정되는 일반 변수와 달리) 리렌더링 사이에 정보를 저장할 수 있습니다.
  2. (리렌더링을 촉발하는 state 변수와 달리)변경해도 리렌더링을 촉발하지 않습니다.
  3. (정보가 공유되는 외부변수와 달리)각각의 컴포넌트에 로컬로 저장됩니다.

ref를 변경해도 다시 렌더링되지 않으므로 화면에 표시되는 정보를 저장하는 데는 ref가 적합하지 않습니다. 대신 state를 사용하세요.

 

2️⃣ ref로 DOM 조작하기

ref를 사용하여 DOM을 조작하는 것은 특히 일반적입니다. React에는 이를 위한 기본 지원이 있습니다.

먼저 초기값이 null인 ref객체를 선언하세요:

import { useRef } from 'react';

function MyComponent() {
  const inputRef = useRef(null);
  // ...

 

그런 다음 ref객체를 ref 속성으로 조작하려는 DOM노드의 JSX에 전달하세요:

  // ...
  return <input ref={inputRef} />;

 

React가 DOM노드를 생성하고 화면에 그린 후, React는 ref객체의 current 프로퍼티를 DOM노드로 설정합니다. 이제 DOM노드 <input> 접근해 focus()와 같은 메서드를 호출할 수 있습니다.

function handleClick() {
    inputRef.current.focus();
  }

노드가 화면에서 제거되면 React는 current 프로퍼티를 다시 null로 설정합니다.

 

3️⃣ ref 콘텐츠 재생성 피하기

React는 초기에 ref 값을 한 번 저장하고, 다음 렌더링부터는 이를 무시합니다.

function Video() {
  const playerRef = useRef(new VideoPlayer());
  // ...

new VideoPlayer()의 결과는 초기에 렌더링에만 사용되지만, 호출 자체는 이후의 모든 렌더링에서도 여전히 계속 이뤄집니다. 이는 값비싼 객체를 생성하는 경우 낭비일 수 있습니다.

 

이 문제를 해결하려면 대신 다음과 같이 ref를 초기화할 수 있습니다:

function Video() {
  const playerRef = useRef(null);
  if (playerRef.current === null) {
    playerRef.current = new VideoPlayer();
  }
  // ...

일반적으로 렌더링 중에 ref.current를 쓰거나 읽는 것은 허용되지 않습니다. 하지만 이 경우에는 결과가 항상 동일하고 초기화 중에만 조건이 실행되므로 충분히 예측할 수 있으므로 괜찮습니다.

'리액트 공식문서 스터디' 카테고리의 다른 글

useEffect  (0) 2024.06.04
2회차 발표  (0) 2024.05.31
useContext  (0) 2024.05.28
1회차 발표 useState, useReducer  (0) 2024.05.24
useReducer  (0) 2024.05.22