[React] useRef

2022. 2. 8. 18:44·React/기능
반응형

Javascript를 사용할 때, 특정 DOM을 선택해야 하는 상황에서 getElementById, querySelector 같은

DOM Selector 함수를 사용해서 DOM을 선택해야 한다.

 

리액트를 사용하는 프로젝트에서도 마찬가지로 DOM을 직접 선택해야 하는 상황이 발생할 수 있다.

예를 들어 특정 엘리먼트의 크기를 가져와야 한다던지, 스크롤바 위치를 가져오거나, 설정하든지,

또는 포커스를 설정해줘야 한다던지 등, 생각보다 다양한 상황이 있다.

 

그리고 Video.js, JWPlayer 같은 HTML5 Video 관련 라이브러리, 또는 chart.js 같은 그래프 관련

라이브러리 등의 외부 라이브러리를 사용할 때도 특정 DOM에다가 적용해야 한다.

이럴 때, 리액트에서는 ref라는 것을 사용한다.

 

※ What is ref??

[React] ref란?

 

함수형 컴포넌트에서 ref 를 사용할 때에는 useRef라는 Hook 함수를 사용한다.

클래스형 컴포넌트에서는 콜백 함수를 사용하거나, React.createRef 라는 함수를 사용한다고 한다.

const UseRefExample = () => {
  const [string, setString] = useState('');
  const [stringList, setStringList] = useState([]);

  // Here's useRef!
  const inputText = useRef();

  const change = useCallback((e) => {
    setString(e.target.value);
  }, []);

  const insert = useCallback(() => {
    const newList = stringList.slice();
    newList.push(string);
    setStringList(newList);

    // Here's focusing!
    inputText.current.focus();
  }, [string, stringList]);

  const sum = useCallback((list) => {
    console.log('문자들을 합치는 중입니다...');
    let stringSum = '';
    for(let value of list) {
      stringSum += value + ' ';
    }
    return stringSum;
  }, []);

  const result = useMemo(() => sum(stringList), [stringList, sum]);

  return (
    <div>
      <input type='text' ref={inputText} onChange={change}/> // <- using Ref
      <button onClick={insert}>문자열 추가</button>
      {result}
    </div>
  )
}

위 코드는 버튼을 누를 경우 focus가 자동으로 input으로 이동하게 된다.

여기서 useRef 의 사용법은 간단하다!

  • const inputText = useRef(); 변수를 선언하고
  • <input type='text' ref={inputText} onChange={change}/> 태그에서 ref를 등록하고
  • inputText.current.focus(); 사용하면 끝!

여기서. current 값은 우리가 원하는 DOM을 가리키게 된다.

useRef의 사용방법은 한 가지 더 있는데, 로컬 변수를 선언할 때 사용하는 것이다.

import React, {useRef} from 'react';

const LocalVar = () => {
  const localVar = useRef(1);

  const increaseLocalVar = () => {
    localVar.current = localVar.current + 1;
  }

  return (
    <div>
      {localVar}
    </div>
  )
}

export default LocalVar;

로컬 변수는 렌더링과 상관없이 바뀔 수 있는 값이다.

그리고 컴포넌트에서 어떤 변수를 선언하게 되면, 다음 렌더링을 할 때 해당 값이 유지되지 않고

모두 초기화가 된다.

 

만약 변수를 컴포넌트 밖에 선언했을 때, 컴포넌트 마운트/언마운트 시 값을 초기화시키고 싶을 때,

직접 초기화 하는 작업을 할 때 사용한다.

반응형
저작자표시 비영리 변경금지

'React > 기능' 카테고리의 다른 글

[React] react-router-dom 사용하기  (1) 2022.10.05
[React] useLayoutEffect  (0) 2022.02.08
[React] useEffect  (0) 2022.02.08
[React] useState  (0) 2022.02.08
[React] Route 부가적인 부분 (history, withRouter..)  (0) 2022.02.08
'React/기능' 카테고리의 다른 글
  • [React] react-router-dom 사용하기
  • [React] useLayoutEffect
  • [React] useEffect
  • [React] useState
잉여개발자
잉여개발자
풀스택 개발자를 목표로 잉여롭게 개발 공부도 하면서 다양한 취미 생활도 즐기고 있는 잉여 개발자입니다.
  • 잉여개발자
    잉여로운 개발일지
    잉여개발자
    • 분류 전체보기 (789)
      • 개발정보 (36)
      • 개발환경 (7)
      • 개발생활 (19)
      • React (141)
        • 이론 (23)
        • 기능 (12)
        • 실험실 (88)
        • 버그 (6)
        • 패스트캠퍼스 (9)
        • Npm (3)
      • React Native (28)
        • 공통 (6)
        • TypeScript (3)
        • JavaScript (18)
        • 버그 (1)
      • Next.js (30)
        • 이론 (13)
        • 실험실 (13)
        • 버그 (3)
      • Web (35)
      • 알고리즘 (202)
        • 풀이 힌트 (39)
      • JavaScript (47)
      • TypeScript (29)
        • 기초 (27)
        • 실험실 (2)
      • Node.js (13)
        • 이론 (0)
        • 기능 (3)
        • 실험실 (9)
        • 버그 (1)
      • 도커 (4)
      • CCNA (22)
        • 이론 (4)
        • 문제 (18)
      • 취미생활 (167)
        • 잉여로운 칵테일 (2)
        • 잉여의 식물키우기 (130)
        • 잉여로운 여행기 (11)
        • 잉여의 제2외국어 (21)
        • 잉여로운 책장 (2)
      • Java (1)
        • Java의 정석 (1)
      • 꿀팁 공유 (3)
  • 태그

    바질
    네이버 부스트캠프
    ReactNative
    식물
    redux
    next.js
    Docker
    덤프
    CCNA
    바질 키우기
    react
    네트워크
    Node.js
    타일러영어
    CSS
    프로그래머스
    다이소
    webpack
    자바스크립트
    리얼클래스
    typescript
    리얼학습일기
    영어독학
    영어회화
    ChatGPT
    리액트
    javascript
    타입스크립트
    Babel
    알고리즘
  • hELLO· Designed By정상우.v4.10.1
잉여개발자
[React] useRef
상단으로

티스토리툴바