๐ก useRef๋ ๋ ๋๋ง์ ํ์ํ์ง ์์ ๊ฐ์ ์ฐธ์กฐํ ์ ์๋ React Hook์ ๋๋ค.(๊ณต์๋ฌธ์)
๋ฌด์ง์ฑ ์ฌ์ฉํ๋ Hook์ ํ์ ํด๋ณด์;ใ ;
useRef๋ ์ฒ์์ ์ค ์ด๊ธฐ๊ฐ์ current ํ๋กํผํฐ๋ก ref๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. ํ๋ง๋๋ก ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ์ฝ์์ ์๊ฒ ํด์ค๋ค. ์ด๋ ๊ฒ๋ง ๋งํ๋ฉด useState์ ์ฐจ์ด๊ฐ ์๊ฒ ๋๊ปด์ง๊ฒ ์ง๋ง state ๊ฐ์ด ๋ณ๊ฒฝ๋๋ฉด ๋ฆฌ๋๋๋ง์ ์ด๋ฐํ์ฌ ๋ณ๊ฒฝ๋ ๊ฐ์ ์๊ฐ์ ์ผ๋ก ์ถ๋ ฅ์์ผ์ค๋ค. ํ์ง๋ง useRef์ ref ๊ฐ์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ ๋ฆฌ๋๋๋ง์ ์ด๋ฐ์ํค์ง ์์ ๋ฆฌ๋๋๋ก ๋ณํ์ง ์์์ผํ๋ ๊ฐ์ ์ฌ์ฉํ๊ธฐ์ ์ ์ ํ๋ค.
useRef๋ DOM์ ๋ ธ๋๋ฅผ ์กฐ์ํ ์ ์๊ฒ ํ๋ค.
<input ref={inputRef}/>
์์ ์์์ฒ๋ผ ์ฌ์ฉํ๊ฒ ๋๋ฉด input์ node๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ๋๋ค. ์ฌ๊ธฐ์ ๋ ธ๋ ๊ด๋ฆฌ๋ ์์๋ฅผ ์๋ก ๋ค๋ฉด input์ ์์ฑ (focus, value...) ๋ฑ์ ๊ด๋ฆฌ, ์ฌ์ฉํ ์ ์๊ฒ ๋๋๊ฒ์ ๋งํ๋ค.
import { forwardRef, useRef } from 'react';
const MyInput = forwardRef((props, ref) => {
return <input {...props} ref={ref} />;
});
export default function Form() {
const inputRef = useRef(null);
function handleClick() {
inputRef.current.focus();
}
return (
<>
<MyInput ref={inputRef} />
<button onClick={handleClick}>
Focus the input
</button>
</>
);
}
useRef์ ์ญํ ์ ์์์ผ๋ useRef์ ์ญํ ์ ํ ์ ์๋ ์ปค์คํ ํ ์ ๋ง๋ค์ด๋ณด์!
๊ทธ๋ผ ์ ์ผ๋จ ๋ด๊ฐ ๋ง๋ค useMyRef๋ ํด์ผํ ์ญํ ์ด
1. ๊ฐ์ ํ ๋น ํ ์ ์์ด์ผํจ
2. ๊ฐ์ด ๋ณํด๋ ๋ฆฌ๋๋๋ง์ด ๋๋ฉด ์๋จ
3. dom์ ์กฐ์ํ ์ ์์ด์ผํจ
4. ์ํ๋ ๋๋ก ๊ฐ ๋ณ๊ฒฝ์ ํ ์ ์์ด์ผํจ
import { useState } from 'react';
export function useMyRef<T>(initValue: T | null) {
// ref๋ฅผ ์ ์ฅํ state๋ฅผ ์์ฑ. { current: initValue}๊ฐ์ฒด๋ฅผ ํตํด current๊ฐ์ด ๋ณ๊ฒฝ๋๋๋ผ๋ ๋ฆฌ๋๋๋ง ๋์ง ์๊ฒ ํจ
const [ref, setRef] = useState<{ current: T | null }>(() => ({ current: initValue }));
// setRef๋ฅผ ํตํด ref์ ๊ฐ์ ๋ณ๊ฒฝ.
const setRefValue = (value: T | null) => {
setRef({ current: value });
};
return [ref, setRefValue];
}
์์ ์ฝ๋๋ฅผ ๋ณด๋ฉด ์์์ ๋ง์กฑํด์ผ ํ๋ ์ญํ ์ค ๊ฐ์ ํ ๋น์ useState๋ฅผ ํตํด์ ์ฒ์ initialValue๋ฅผ ์ค์ ํด์ฃผ๊ณ state๊ฐ์ ๊ฐ์ฒด๋ก ์ค์ ํ์ฌ current์ ๊ฐ์ด ๋ฐ๋๋๋ผ๋ ๋ฆฌ๋๋๋ง์ด ์ผ์ด๋์ง ์๊ฒ ์ค์ ํ์์ผ๋ฉฐ useRef ์ ๋ง์ฐฌ๊ฐ์ง๋ก dom์ ์ด ๋ํ ๊ฐ๋ฅํ๋ค. ์ถ๊ฐ๋ก setRef๋ฅผ ํตํด ref๊ฐ์ ๋ณ๊ฒฝ ๋ํ ๊ฐ๋ฅํ๊ฒ ํด ๋์๋ค.