Javascript에서 HTML태그를 선택할 때는 보통 getElementId
를 사용했다.
React에서는 useRef
라는 Hook
함수가 HTML 태그에 접근하도록 도와준다.
useRef
는 DOM을 직접 선택하여 HTML 태그에 접근가능하게 하는데
어떤 상황에서 useRef
를 사용하면 좋은 지 알아보자.
focus
를 설정할 때.클래스형 컴포넌트에서는 React.createRef()
혹은 콜백 함수로
특정 DOM에 접근 가능하다.
import { useRef } from 'react'
export default function Web() {
const inputEl = useRef(null);
return <input ref={inputEl} id="fileTag" type="file" onChange={readImage}></input>
}
useRef
는 useState
, useEffect
처럼 react에서 가져와야 사용할 수 있다.
가져온 useRef
를 호출해서 inputEl
이라는 객체를 생성한 후에
선택하고 싶은 DOM
에다가 ref={inputEl}
을 작성하면
DOM
에 inputEl
를 이용해 접근할 수 있다.
위에서 작성한 코드에 아래와 같은 함수가 추가된다고하자.
const handleFileBtn = () => {
inputEl.current.click()
}
이 함수는 새로 추가할 버튼의 onClick에 넣을 함수이다.
Ref의 current 안에는 click이라는 기능이 있다.
이는 이름 그대로 current
는 inputEl
에 들어온 태그를 뜻하며 그 태그를 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
태그를 클릭한 것과 동일한 결과를 볼 수 있다.
감사합니다 ㅎㅎ이해가잘되었어용