useRef?const 변수 = useRef<타입>(초기값)
-> 매번 호출을 해야하기 때문에 불편, React에서는 React DOM을 사용하기 때문에 일반적인 DOM같은경우는 안정성이 떨어질 가능성이 있다.
const onButtonClickHandler = () => {
const inputElement = document.getElementById('input');
inputElement?.focus(); //inputElement null 값이 아니면 포커스 작업을 해라
}
inputRef.current?.focus(); useRef로 생성한 참조 객체는 해당 변수의 current 속성에 들어있다.변수?속성 혹은 변수?.메서드()로 지정Ex1) focus를 눌렀을 경우 해당 input에 포커스가 맞춰짐
import React from 'react'
export default function HookComponent2() {
const inputRef = useRef<HTMLInputElement>(null);
const onButtonClickHandler = () => {
//inputRef.current?.focus(); ->안정성은 떨어진다.
//밑에 코드 처럼 직접적으로 명시 하는 방법이 좋다.
if(!inputRef.current) return;
inputRef.current.focus();
}
return (
<div>
<input ref={inputRef} id='input' />
<button onClick={onButtonClickHandler}>focus</button>
</div>
)
}
Ex2) 이미지를 첨부하여 이미지를 화면에 표시하는 예제
export default function HookComponent2() {
const inputRef = useRef<HTMLInputElement>(null);
const imageInputRef = useRef<HTMLInputElement>(null);
const [imageUrl, setImageUrl] = useState<string>('');
const onImageInputChangeHandler = () => {
const {current} = imageInputRef;
if(!current) return;
if(!current.files) return;
const file = current.files[0];
const fileReader = new FileReader();
fileReader.readAsDataURL(file);
fileReader.onloadend = () => {
setImageUrl(fileReader.result as string);
};
};
const onImageButtonClickHandler = () => {
const {current} = imageInputRef;
if(!current)return;
current.click();
};
return (
<div>
<img src={imageUrl}/>
<input ref={imageInputRef} type="file" accept='image/*' onChange={onImageInputChangeHandler}/>
<button onClick={onImageButtonClickHandler}>이미지 등록</button>
</div>
)
}