useRef()
Hook ํจ์๋ฅผ ํธ์ถํ๋ฉด ref ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋๋ฐ, ์ด ๊ฐ์ฒด๋ current
๋ผ๋ ์์ฑ์ ๊ฐ์ง๊ณ ์๋ค. ์ด ์์ฑ์ ๋ณ์๋ฅผ ์ ์ฅํ๊ฑฐ๋, DOM ์์์ ์ฃผ์๊ฐ์ ์ฐธ์กฐํ๊ฒ ํ ์ ์๋ค.
useRef()
ํจ์๋ฅผ ํธ์ถํ ๋ ์ ๋ฌ ์ธ์๋ก ์ด๊ธฐ๊ฐ์ ์ ๋ฌํ ์ ์๋ค.import { useRef } from "react";
const ref = useRef(์ด๊ธฐ๊ฐ);
console.log(ref); // { current: ์ด๊ธฐ๊ฐ }
undefined
๊ฐ ํ ๋น๋๋ค.const ref = useRef();
console.log(ref); // { current: undefined }
์ด ref ๊ฐ์ฒด์ current
์์ฑ์ ๊ฐ์ ๋ด์ ์ ์์ผ๋ฉฐ, ์ํ๋ ๋๋ก ๊ฐ์ ๋ณ๊ฒฝ์ํฌ ์ ์๋ค.
์ค์ํ ์ ์, State์ ๋ค๋ฅด๊ฒ ref ๊ฐ์ฒด์ current
์์ฑ๊ฐ์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ด๋ ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค.
ref.current = 1; // ์ปดํฌ๋ํธ ๋ฆฌ๋ ๋๋ง X
console.log(ref); // { current: 1 }
๋ฐ๋ผ์ ๊ฐ์ ๋ณ๊ฒฝํ์ ๋ ๋ฆฌ๋ ๋๋ง์ ๋ฐ์์ํค์ง ์์์ผ ํ๋ ๊ฐ์ ๋ค๋ฃฐ ๋ useRef
๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
ref ๊ฐ์ฒด์๋ ๋ณ์ ๋ฟ๋ง ์๋๋ผ, DOM ๋ ธ๋, ์๋ฆฌ๋จผํธ, React ์ปดํฌ๋ํธ์ ์ฃผ์๊ฐ์ ์ฐธ์กฐ(reference)ํ๊ฒ ํ ์๋ ์๋ค.
const ref = useRef(null);
console.log(ref); // {current: HTMLInputElement}
console.log(ref.current); // <input type="text"></input>
return (
<div>
<input ref={ref} type="text" />
</div>
);
โก๏ธ ref ๊ฐ์ฒด์ input ์์๊ฐ ๋ด๊ธด ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ ๊ฒ input ์์๋ฅผ ๋ด๊ณ ์๋ ref.current
์ focus()
์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
์๋์ ์ฝ๋๋ ๋ฒํผ์ ํด๋ฆญํ๋ฉด input ์์์ ํฌ์ปค์ค๊ฐ ์ด๋ํ๊ฒ ํ๋ค.
const ref = useRef(null);
const focusToInput = () => {
ref.current.focus(); // = input.focus()
}
return (
<div>
<input ref={ref} type="text"/>
<button onClick={focusToInput}>Click Me</button>
</div>
์ด ๋ฐ์๋ input.value()
๋ก input์ ๊ฐ์ ๋ณ๊ฒฝํ ์๋ ์๊ณ , ์ํ๋ ๋ฐฉ์์ผ๋ก DOM ์์๋ฅผ ์กฐ์ํ ์ ์๋ค.
โ ๏ธ ํ์ง๋ง ๊ธฐ๋ณธ React ๋ฌธ๋ฒ์ ๋ฒ์ด๋
useRef
๋ฅผ ๋จ์ฉํ๋ ๊ฒ์ ๋ถ์ ์ ํ๊ณ , React์ ํน์ง์ด์ ์ฅ์ ์ธ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ ์์น๊ณผ ๋ฐ๋๋๊ธฐ ๋๋ฌธ์ ์กฐ์ฌํด์ ์ฌ์ฉํด์ผ ํ๋ค.
๋น๋์ค ์์๋ฅผ ref ๊ฐ์ฒด์ ๋ด์ play()
, pause()
, remove()
๋ฑ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
const videoRef = useRef(null);
console.log(videoRef.current); // <video width="320" height="240" controls="">โฆ</video>
const playVideo = () => {
videoRef.current.play();
};
const pauseVideo = () => {
videoRef.current.pause();
};
const removeVideo = () => {
videoRef.current.remove();
};
return (
<div className="App">
<div>
<button onClick={playVideo}>์ฌ์</button>
<button onClick={pauseVideo}>์ผ์์ ์ง</button>
<button onClick={removeVideo}>์ญ์ </button>
</div>
<video ref={videoRef} width="320" height="240" controls>
<source
type="video/mp4"
src="..."
/>
</video>
</div>