Intro
์๋ ํ์ธ์. ์ด๋ฒ ์๊ฐ์๋ react ์์ useRef ์ฌ์ฉ์ undefined / null ์ค๋ฅ ๋ฐ์ ์์ธ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ฐ์ ์ ๊ฐ useRef๋ฅผ ์ฌ์ฉํ ์ฝ๋ ์์ ๋ ์๋์ ๊ฐ์ต๋๋ค. clientHeight๋ฅผ ์กฐ์ ํ๊ธฐ ์ํด useRef๋ฅผ ์ฌ์ฉํ์ฌ div tag์ ์ ์ฉํ์ต๋๋ค.
const divRef = useRef<HTMLDivElement>(null);
const [handlePosition, setHandlePosition] = useState('300vh');
useEffect(() => {
setHandlePosition(`${(divRef.current.clientHeight * 3) / 300}px`);
}, []);
return (
<div ref={divRef}>
{/* some content */}
</div>
);
ํ์ง๋ง, ํด๋น ์ฝ๋๋ฅผ ์คํ์ undefined ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค.
TS2532: Object is possibly 'undefined'.
Why?
ํด๋น ์๋ฌ๋ divRef.current ๊ฐ์ด undefined์ผ ๊ฐ๋ฅ์ฑ์ด ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ์๋ฌ์ ๋๋ค. ํ์ฌ ์ฝ๋์์ ์ด ๊ฐ์ด null์ด ๊ฐ๋ฅ์ฑ์ด ์๊ณ , ์ด ๊ฒฝ์ฐ์ divRef.current.clientHeight ์์ undefined๊ฐ ๋ฐํ๋ ์ ์์ต๋๋ค.
์ ์ค๋ฅ๋ ์ฝ 2๊ฐ์ง ๋ฐฉ๋ฒ์ผ๋ก ํด๊ฒฐํ ์ ์์ต๋๋ค.
How to solve the problem
#1 null ์ฒดํฌํ๊ธฐ
divRef.current ๊ฐ์ด null์ด ์๋ ๋๋ง setHandlePosition ํจ์๋ฅผ ํธ์ถํ๋๋ก ์ฒ๋ฆฌํฉ๋๋ค.
useEffect(() => {
if (divRef.current) {
setHandlePosition(`${(divRef.current.clientHeight * 3) / 300}px`);
}
}, []);
#2 ์ต์ ๋ ์ฒด์ด๋ ์ฐ์ฐ์(?) ์ฌ์ฉ
useEffect(() => {
if (divRef.current) {
setHandlePosition(`${(divRef.current.clientHeight * 3) / 300}px`);
}
}, []);