useRef vs global Variable

useRef vs Variable

리액트에서 변경이 필요한 값 즉, 상태값이 아닌 변수가 필요한 경우에 let, var를 사용하여 변수를 선언하는 것이 아니라 useRef를 사용하곤 한다.

왜 let을 사용하지 않고 useRef를 사용할까? 그 의구심이 들었다.

우선 variabel 이라고 하면은 두가지 경우가 있다.

  1. local Variable
  2. global Variable

여기서 말하는 local Variable은 컴포넌트 내부 변수를 말한다. 이 경우에는 컴포넌트가 리렌더링시 초기화되기 때문에(당연한…) 사용할 수가 없다.

컴포넌트 밖에서 선언하는 global variable를 써도 되는 거 아닌가 하는 생각이 들었고 그 이유를 찾아보고 이해한 바를 적어보려고한다.

state가 변경될 때 마다 effect를 위한 useEffect를 사용하는 경우를 예를 들어보겠다.
state가 변경될 때마다 useEffect가 작동하겠지만, 첫 렌더링이 될 때에도 작동한다. 그걸 원하지 않아서 firstTime 이라는 변수로 첫 렌더링을 판별하는 방법을 쓸 수 있다.

import React, { useState, useEffect, useRef } from "react";

const Component = () => {
  const [state, setState] = useState(0);
  const firstTime = useRef(true);

  useEffect(() => {
    if (!firstTime.current) {
      // Run the effect.
    } else {
      firstTime.current = false;
    }
  }, [state]);

  return <div></div>;
};

export default Component;

firtTime을 useRef가 아닌 let을 사용한 변수로 사용할 수도 있다.

import React, { useState, useEffect } from "react";

let firstTime = true;

const Component = () => {
  const [state, setState] = useState(0);

  useEffect(() => {
    if (!firstTime) {
      // Run the effect.
    } else {
      firstTime = false;
    }
  }, [state]);
  return <div></div>;
};

export default Component;

만약 컴포넌트가 싱글톤일 경우에는 위 두 경우의 효과는 동일하다. 하지만 컴포넌트가 여러번 사용되어 지는 multiple instance의 경우 문제가 생길 수 있다.

global variable이 공유되어지기 때문이다.!!
그래서 useRef를 사용한다.

references