Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

React, useRef not allowing to access current properties, getting Uncaught TypeError: Cannot read properties of undefined (reading 'clientHeight')

I'm storing a reference to an image item using: const renderedImageRef = useRef(). The ref is then assigned in render() function using:

<img ref={renderedImageRef} src=... />

In another JSX item below, I try to access renderedImageRef.current.clientHeight using:

<div style={{top:`${renderedImageRef.current.clientHeight}px`}}>
   Hello world
</div>

But this produces an error in the console:

Uncaught TypeError: Cannot read properties of undefined (reading 'clientHeight')

Strangely enough, if I try to access renderedImageRef.current.clientHeight from inside a useEffect hook, it displays the height correctly:

useEffect(() => {
    if(renderedImageRef !== null) {
        console.log(renderedImageRef)
    }
}, [renderedImageRef])

Why am I getting the console error?

like image 596
Sam Avatar asked Oct 20 '25 05:10

Sam


1 Answers

A possible answer is that this line:

<div style={{top:`${renderedImageRef.current.clientHeight}px`}}>Hello world</div>

is coming in your code before this one:

<img ref={renderedImageRef} src=... />

In which case, it is normal that you are getting the error. It is to know that when you call const renderedImageRef = useRef(), the value of renderedImageRef is {current:undefined}. The JSX must be rendered before a ref gets its value in the current field.

A solution is to use a state for the top:

const [top, setTop] = useState(0);
useEffect(() => {
  // At this point, the current is defined. This if is useful in case you use TypeScript
  if (renderedImageRef.current) {
    setTop(renderedImageRef.current.clientHeight);
  }
}, []);
<div style={{top:`${top}px`}}>Hello world</div>
like image 172
yousoumar Avatar answered Oct 21 '25 19:10

yousoumar



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!