포스코x코딩온 웹 풀스택 양성과정

[포스코x코딩온] 웹 풀스택 과정 12주차 회고 | React - Ref

Codult 2024. 4. 5. 15:11
728x90

🎈 Ref

React에서 HTML요소를 id를 사용하여 불러온다면, 컴포넌트를 반복하여 사용할 때 id가 중복되는 문제가 발생할 수 있다.
Ref는 전역적으로 작동하지 않고 컴포넌트 내부에서만 선언 및 사용되어 이를 해결해준다.

  • 동일한 컴포넌트를 반복해 사용해도, 각 컴포넌트 내부에서만 동작한다.
  • DOM을 직접적으로 건드려야 할 때 사용한다.
    (ex. 특정 input에 focus 주기, 스크롤박스 조작, 비디오 플레이어의 재생/정지 기능)

💡 클래스형 컴포넌트에서 ref 사용하기

방법1) 콜백함수

  • 사용하고자 하는 DOM 요소에 ref라는 콜백함수 작성
class RefClass extends Component {
  handleFocus = () => {
    this.myInput.focus();
  }
  render() {
    return (
      <>
        <input ref={(ref) => (this.myInput = ref}/>
        <button onClick={this.handleFocus}>focus</button>
      </>
    )
  }
}


방법2) 내장함수 createRef

  • React.createRef 함수를 이용하여, 컴포넌트 내부에서 변수에 ref 요소를 담아준다.
  • ref 요소를 실제 DOM 요소의 prop에 연결한다.
  • 사용할 때는 this.input.current로 불러와 이용한다.
import { Component, createRef } from "react";

class RefClass extends Component {
  myInput = createRef();
  handleFocus = () => {
    this.myInput.current.focus();
  }
  render() {
    return (
      <>
        <input ref={this.myInput}/>
        <button onClick={this.handleFocus}>focus</button>
      </>
    )
  }
}


💡 함수형 컴포넌트에서 ref 사용하기

Hook의 useRef()를 이용한다.

  • useRef(): 인자로 받은 값으로 초기화된, 변경가능한 ref 객체를 반환한다.
  • 생성된 ref 객체를 원하는 DOM 요소에 ref 값으로 설정한다.
  • ref.current으로 객체에 접근할 수 있다.
import { useRef } from "react";

export defaut function RefFunc1() {
  const inputRef = useRef();
  const handleFocus = () => {
  }
  return (
    <>
      <input ref={inputRef}/>
      <button onClick={handleFocus}>focus</button>
    </>
  )
}
  • ref 값이 변경되어도 리렌더링 되지 않음 (컴포넌트 내에서 로컬변수로 활용 가능)
import { useRef } from "react";

export default function RefFunc2() {
  const idRef = useRef(1);
  const plusIdRef = () => {
    idRef.current += 1;
    // idRef 값이 +1 되어도, 리렌더링되지 않음
    console.log(idRef.current);
  }
  return (
    <>
      <h2>{idRef.current}</h2>
      <button onClick={plusIdRef}>plus ref</button>
    </>
  )
}
728x90