# useRef로 DOM node의 크기 위치 정보등 가져오기
하 이게 문제가 뭐나면 내가 만든 function component는 매번 새롭게 생성되는 것이라서(컴포넌트는 만들어지면 4초이후 없어지고, 다음 이벤트에 새로 생성됨) 그때 useRef로 가져온 current에는 element의 정보가 담겨있지가 않는것이 문제 였다.
계속해서 나는 null에서 뭘 할 수가 없는데라는 오류 메세지가 떠서
document에서 id를 통해 element를 잡아오려 하였지만 이것또한 불가능... didMount 상태에서는 원래 정상적으로 가져와야하는 것인데 왜 안되는 것일까?
useEffect에서도 layoutEffect에서도 안 들고와지는 것은 무슨 문제인지 파악해서 업데이트 하겠슴...
기존 코드
const TooltipBox = useRef(null);
const [height, setHeight] = useState(0);
useLayoutEffect(() => {
console.dir(document.getElementById("TooltipBox")); // 여기서도 에러가 난다
if (TooltipBox.current) {
console.log(TooltipBox.current.clientHeight); // 여기로는 절대 못들어 온다...
setHeight(TooltipBox.current.clientHeight);
}
}, []);
if (!isVisible.state) return '';
return (
<Div
ref={measuredRef}
className="chatTooltip"
x={user.position.x - 60 + 'px'}
y={user.position.y - height + 'px'}
>
일단 DOM node에서 정보 가져오기는 react에서 사실 알려주고 있었는데 아래 쪽에 작성한 코드를 확인해보면
변경 코드
const [height, setHeight] = useState(0);
const measuredRef = useCallback(node => {
if (node !== null) {
setHeight(node.getBoundingClientRect().height);
}
}, []);
if (!isVisible.state) return '';
return (
<Div
ref={measuredRef}
className="chatTooltip"
x={user.position.x - 60 + 'px'}
y={user.position.y - height + 'px'}
>
이렇게 useCallback을 이용하여 ref에 callback 함수를 넣어주면 알아서 정보를 잘 가져온다.