useRef

Kingmo·2022년 4월 9일

1. useRef

Javascript에서 HTML태그를 선택할 때는 보통 getElementId를 사용했다.
React에서는 useRef라는 Hook함수가 HTML 태그에 접근하도록 도와준다.

useRef는 DOM을 직접 선택하여 HTML 태그에 접근가능하게 하는데
어떤 상황에서 useRef를 사용하면 좋은 지 알아보자.

  • 특정 엘리먼트 크기나 위치를 가져올 때.
  • 특정 DOM에 focus를 설정할 때.
  • 특정 라이브러리를 사용할 때.
  • 스크롤 바 위치를 가져오거나 설정해야 할 때.

클래스형 컴포넌트에서는 React.createRef()혹은 콜백 함수로
특정 DOM에 접근 가능하다.


2. useRef 사용하기

useRef 기본 설정

  • 사용 예시
import { useRef } from 'react'

export default function Web() {
  const inputEl = useRef(null);
	
  return <input ref={inputEl} id="fileTag" type="file" onChange={readImage}></input>
}

useRefuseState, useEffect처럼 react에서 가져와야 사용할 수 있다.
가져온 useRef를 호출해서 inputEl이라는 객체를 생성한 후에
선택하고 싶은 DOM에다가 ref={inputEl}을 작성하면
DOMinputEl를 이용해 접근할 수 있다.


3. useRef의 기능

위에서 작성한 코드에 아래와 같은 함수가 추가된다고하자.

const handleFileBtn = () => {
	inputEl.current.click()
}

이 함수는 새로 추가할 버튼의 onClick에 넣을 함수이다.
Ref의 current 안에는 click이라는 기능이 있다.

이는 이름 그대로 currentinputEl에 들어온 태그를 뜻하며 그 태그를 click하겠다는 기능이다.

그리고 버튼 태그를 추가하고 위 함수를 onClick에 바인딩 하자.

<button onClick={handleFileBtn}>이미지 등록 버튼</button>

이렇게 하면 button을 클릭했을 때 inputEl.current.click()이 실행되고, 그것은 우리가 useRef에 넣어둔 input 태그를 클릭한 것과 같은 결과가 나온다.

위 사진의 이미지 등록 버튼을 눌렀을 때 input태그를 클릭한 것과 같은 결과가 발생한다.

여기서 조금 더 응용 해보자!
위 코드의 return부분을 다음과 같이 바꿔보자.

return (
  <>
    <div>
      <img onClick={handleFileBtn} style={{ width: "500px" }} id="image" />
      <input
        hidden={true}
        ref={inputEl}
        id="fileTag"
        type="file"
        onChange={readImage}
      ></input>
      <button onClick={handleFileBtn}></button>
    </div>{" "}
  </>
);

위의 코드를 보면 함수handleFileBtn가 img태그와 button태그에 바인딩 되어있다.
그리고 input 태그에는 hidden 기능을 이용해 태그를 숨겨주었다.

이러면 우리는 미리보기 이미지를 클릭할 때, 이미지 등록 버튼을 클릭할 때
모두 input=file 태그를 클릭한 것과 동일한 결과를 볼 수 있다.

profile
Developer

1개의 댓글

comment-user-thumbnail
2023년 9월 22일

감사합니다 ㅎㅎ이해가잘되었어용

답글 달기