useRef는 크게 두 가지 경우에 사용할 수 있습니다.
useRef는 초기값으로 설정된 current
라는 단일 속성을 사용합니다.
// JSX import { useRef } from 'react'; function Counter() { const countRef = useRef(0); function handleClick() { countRef.current = countRef.current + 1; alert('You clicked ' + countRef.current + ' times!'); } return ( <> <button onClick={handleClick}> Click me! </button> <p>count: {countRef} </p> </> ); };
위 사항을 통해 ref와 state는 렌더링에서 차이가 있는 것을 알 수 있습니다.
그렇다면 일반 변수와 ref의 차이는 무엇일까요?
// JSX function Counter() { const countRef = useRef(0); const count = 0; return ( ~~~ ); };
위와 같이 ref와 일반 count변수를 생성하고 값을 변경할 때에
Counter 컴포넌트가 렌더링된다면 countRef는 값이 유지되며 count는 다시 0으로 초기화됩니다.
state => 값 저장 + 렌더링
ref => 값 저장
일반 변수 => 값 초기화
// JSX import { useRef } from 'react'; function MyComponent() { const inputRef = useRef(null); return( <> <input ref={inputRef} /> </> ); }
current.focus()
를 이용해 해당 요소에 초점을 맞출 수 있습니다.current.scrollTop
, current.scrollLeft
의 값을 변경하여 버튼식 스크롤 조작이 가능합니다.current.play()
, current.pause()
를 이용해 조작 가능합니다.// JSX import { forwardRef, useRef } from 'react'; const MyInput = forwardRef((props, ref) => { return <input ref={ref} />; }); export default function Form() { const inputRef = useRef(null); return ( <> <MyInput ref={inputRef} /> </> ); }
// JSX function Component(props) { const [position, setPosition] = useState({ top: 0, left: 0 }); const [size, setSize] = useState({ width: 0, height: 0 }); const mainRef = useRef(null); useEffect(() => { const handleResize = () => { const mainElement = mainRef.current; if (mainElement) { const rect = mainElement.getBoundingClientRect(); setPosition({ top: rect.top, left: rect.left }); setSize({ width: mainElement.offsetWidth, height: mainElement.offsetHeight }); } }; setTimeout(() => { handleResize(); }, 10); window.addEventListener("resize", handleResize); return () => window.removeEventListener("resize", handleResize); }, [position, size]); return ( <Main ref={mainRef}> </Main> ); }
같은 이름의 Ref
사용 혹은 반복문으로 컴포넌트를 사용할 때 각각에 Ref
를 사용하려고 할 때 배열로 사용하고 싶을 수 있습니다.
배열에 useRef()
를 여러개 사용하면 됩니다.
해당 내용은 React 공식 문서를 참고하여 작성되었습니다.