리액트의 기본기 useState,useRef

미마모코딩·2022년 9월 15일
1

리액트 기본기

목록 보기
1/6
post-thumbnail
post-custom-banner

useState , useRef 의 차이

우리는 react에서 상태를 기억하고 상태를 동적으로 변경하기 위해 useState를 사용한다.

useState는 우리가 초기값으로 전달해준 값이 바뀌게 되면 리랜더링 되는것을 모두 알고있을 것이다.

하지만 useRef도 값을 저장하고 Dom요소처럼 사용도 할 수 있는데 두 훅의 차이점은 무엇일까?

state에 변화가 일어나면? - 랜더링이 된다. - 컴포넌트 내부 변수들의 초기화가 이루어진다. (스테이트의 변화)

ref의 변화가 일어나면? - 랜더링이 되지 않는다. - 변수들의 값이 유지된다.

카운터를 만들어 보면 재미있는 일이 일어난다 ,

아래는 useState , useRef hook을 사용해 만들어낸 카운트 예제이다.

import "./App.css";
import { useState, useRef } from "react";

function App() {
  const [count, setCount] = useState(0);
  const countRef = useRef(0);

  const increaseState = () => {
    setCount(count + 1);
  };

  const increaseRef = () => {
    countRef.current = countRef.current + 1;
  };

  return (
    <div className="App">
      <div>
        <span>State:{count}</span>
        <button onClick={increaseState}>state Up</button>
      </div>
      <div>
        <span>Ref:{countRef.current}</span>
        <button onClick={increaseRef}>Ref Up</button>
      </div>
    </div>
  );
}

export default App;

위 코드를 보면 state up 이라는 버튼을 누르면 즉시 useState의 상태가 변경되므로 리랜더링이 일어난다.

하지만 ref는 값이 변경되어도 리랜더링 되지 않고 0 을 유지한다.

정말 0인 값으로 남아있을까? 아니다 내부적으로 올라가고 있지만 리랜더링만 되지 않는것이다.

이 상황에서 ref의 값을 랜더링 시키려면 상태를 변경시키면 될 것이다.

다시 한 번 state up 버튼을 눌러 리랜더링을 시키게 되면 ref의 값은 올라가있다.

변수와 ref의 상관관계는 어떨까?

let counter = 0 으로 할당해

const counterIncrease = ()=> { counter = counter +1}라는 함수를 작성하고 ref를 증가시키면 어떻게 될까?

변수와 ref는 증가를 해도 둘 다 랜더링이 되지않기에 화면속에서의 변화는 없다 .

하지만 스테이트를 만들어 리랜더링을 시키면 어떻게 될까?

ref는 증가하고 변수는 아무리 클릭을해도 0 으로 남아있다 .

이 이유는 간단하다 .

컴포넌트가 리랜더링 된다는 것은 컴포넌트를 나타내는 함수 자체가 다시 불린다는 것이다 .

이 과정에서 함수가 불릴때마다 함수 내부의 변수들은 다 초기화가 되기때문에 console.log()를 찍으면 변수의 값은 올라가도 리랜더링을 시키면 화면에서 계속 0으로 남는것이다.

post-custom-banner

2개의 댓글

comment-user-thumbnail
2022년 9월 15일

출처를 감춘 뒤 10년 후에 있을 카카오 초청 리액트 강의에 인용해도 될까요?

답글 달기
comment-user-thumbnail
2022년 9월 15일

Thank you for the good content.

답글 달기