React

useRef

soheedev 2023. 3. 20. 00:50

useRef란?

- 특정한 요소의 id처럼 활용 할 수 있고 변수를 만드는 것에도 사용할 수 있는 리액트 훅이다.

사용방법

1. 변수선언시 useRef(초기값)를 이용한다.

const 변수명 = useRef(초기값)

2. 특정 jsx요소에 ref={변수명} 형태로 할당해준다.

<input placeholder="아이디를 입력하세요" ref={userId} />

3. 변수에 접근은 변수명.current를 통해서만 가능하다.

 

사용예제

1. 로그인 화면예제

import React, { useRef } from 'react';

function UseRef() {
  const userId = useRef('');
  const userPw = useRef('');

  const login = () => {
    console.log(userId.current.value);
    console.log(userPw.current.value);
  };
  return (
    <div>
      UseRef
      <input ref={userId} placeholder='아이디를 입력하세요' />
      <input ref={userPw} placeholder='비밀번호를 입력하세요' type='password'
        onKeyDown={(e) => {
          if (e.key === 'Enter') login();
        }}
      />
      <button onClick={login}>login</button>
    </div>
  );
}
export default UseRef;

- 보통 입력한 값의 유효성 확인을 위해 useRef보다는 state를 활용하는 경우가 더 많다.

 

2. 간단한 계산기 예제

import React, { useState, useRef } from 'react';

function Calculator() {
  const [resultNum, setResultNum] = useState(0);
  const firstNum = useRef(0);
  const secondNum = useRef(0);
  const sum = () => {
    setResultNum(Number(firstNum.current.value) + Number(secondNum.current.value));
  };

  return (
    <div>
      Calculator
      <input ref={firstNum} />
      <input ref={secondNum} />
      <button onClick={sum}>Add</button>
      <p>{resultNum}</p>
    </div>
  );
}

export default Calculator;

- input태그, useRef, useState, onClick 모두 활용되었다.

효율적인 변수로 사용

useRef는 재렌더링이 되지 않는 변수를 만들고자 할 때도 사용가능하다. 값이 변할 때마다 다시 렌더링하지 않아도 될 변수라면, 굳이 useState를 사용할 필요가 없다. 렌더링과 별개로, useRef값의 경우 컴포넌트가 다시 렌더링되더라도 다시 선언되는 것이 아니라 변한 값이 그대로 남아있게 된다는 점에서 변수와는 차이가 있다.

위 2번 예제에서 resultNum부분을 아래와 같이 useRef로 변경하면 아무리 값을 더해도 값이 렌더링되지 않는다.

const resultNum = useRef(0)

const sum = () => {
    resultNum.current = (Number(firstNum.current.value) + Number(secondNum.current.value));
    console.log(resultNum.current)
  };

시간초 설정하는 타이머 예제

  • onChange활용하여 입력한 값 그대로 타이머에 반영되어야 한다.
  • useState, onClick, useRef 활용한다.
  • '설정'버튼 클릭시 시간초가 바뀌도록 하고 엔터만 입력해도 시간이 설정되도록 한다.
import React, { useState, useRef, useEffect } from 'react';

function Timer() {
  const [seconds, setSecond] = useState(60);
  const [isClicked, setIsClicked] = useState(false);
  const inputRef = useRef();

  const inputHandler = () => {
    const { value } = inputRef.current;
    setSecond(value);
  };
  useEffect(() => {
    if (isClicked) {
      const countDown = setTimeout(() => {
        if (seconds > 0) {
          setSecond(seconds - 1);
        } else {
          clearTimeout(countDown);
        }
      }, 1000);
      return () => clearTimeout(countDown);
    }
  }, [seconds, isClicked]);

  return (
    <div>
      <input ref={inputRef} onChange={inputHandler} onKeyDown={(e) => {
          if (e.key === 'Enter') {
            inputHandler();
          }
        }}
      />
      <button onClick={inputHandler}>설정</button>
      <h1>Timer</h1>
      <h1>{seconds}</h1>
      <button onClick={() => setIsClicked(true)}>start</button>
      <button onClick={() => setIsClicked(false)}>stop</button>
    </div>
  );
}
export default Timer;

Timer
타이머 예제

 

 

 

20230303 패스트캠퍼스 FE4기 수업자료를 참고하였습니다.

'React' 카테고리의 다른 글

TodoList 만들기(1)  (0) 2023.04.05
Styled-components  (0) 2023.03.21
이벤트핸들러  (0) 2023.03.15
useEffect  (0) 2023.03.09
불변성  (0) 2023.03.08