React | Hooks 살펴보기 => useRef

sik2·2021년 8월 15일
1

React

목록 보기
4/4

지난 포스팅에선 useState, useEffect에 대하여 알아보았습니다.
이번에는 useRef를 다룹니다.

useRef

HTML 에서 <div id='name'> 과 같이 id 값을 달아주면

  • CSS : #name { background-color: red; }
  • 자바스크립트 : document.getElementById('name')

위와 같이 돔을 선택할 수 있습니다. 리액트에서 DOM을 선택해야할 때 ref를 사용하면 됩니다. 함수형 컴포넌트 안에서는 useRef를 사용하면 됩니다.

.current 를 통해 포커스 이동 구현

구현 코드

useRef() 로 만든 객체에 .current로 접근이 가능합니다. 지난번 포스팅에 사용된 카운터 예제를 활용해서 살펴보겠습니다.

(root)/src/Count.js

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

const Count = () => {
  const [count, setCount] = useState(0);
  const inputRef = useRef(); 👈 👈

  const onReset = () => {
    setCount(0);
    inputRef.current.focus(); 👈 👈 👈 👈
  };

  return (
    <div>
      <input value={count} ref={inputRef} readOnly /> 👈 👈 👈
      <button onClick={() => setCount(count + 1)}>Click me</button>
      <button onClick={() => onReset()}>Reset</button>
    </div>
  );
};

export default Count;
  • 👈 먼저 useRef 함수를 가지고 옵니다.

  • 👈 👈 통해 inputRef에 ref 객체를 반환합니다.

  • 👈 👈 👈 input 태그에 ref={inputRef}를 추가합니다. inputRef.current 를 통해 해당 돔 요소에 접근 가능한 id처럼 사용할 수 있습니다.
    +) 해당 value는 단지 읽기만을 위한 값으므로 input 태그에 readOnly 추가해 로 에러를 잡아줍니다.

  • 상태를 초기화하는 onReset 함수를만들고 Reset 버튼을 누르면 실행되도록 합니다. 👈 👈 👈 👈 그때 inputRef.current.focus()를 통해 포커스가 인풋창을 향하도록 합니다.

(root)/src/App.js

  import React from "react";
  import Count from "./Count";

  const App = () => {
    return (
      <div className="App">
        <Count />
      </div>
    );
  };

  export default App;
  • Count 컴포넌트를 App에서 렌더링합니다.

적용 화면

  • Reset버튼을 눌렀을때 포커스가 인풋창을 가리키게 됩니다.

정리

  • 리액트에서 ref를 통해 DOM을 선택할 수 있다.
  • 함수형 컴포넌트에서는 useRef를 사용하면 된다.
  • useRef() 로 만든 객체에 .current로 접근이 가능하다.

앞으로

useRef를 이용하면 컴포넌트 안의 변수 만들 수 있습니다. 이번 포스팅에서는 다루지 않고 앞으로 포스팅할 투두앱 만들기에서 다루겠습니다.

투두앱 만들기에서는 앞서 배운 hooks의 useState, useEffect, useRef만 활용해 기능을 구현할 예정입니다. 이후 리펙토링 과정에서 useMemo, useCallBack과 같은 메모제이션 hooks를 활용해볼 예정입니다.

cf)
https://chanhuiseok.github.io/posts/react-7/
https://reactjs.org/docs/hooks-reference.html#useref

profile
기록

0개의 댓글