DEV Community

Discussion on: React Hooks (useContext, useEffect, useState, useRef) Summarized Like Crazy (Short & Concise Article)

Collapse
 
ishakmohmed profile image
Mohmed Ishak • Edited

Short answer: useRef refers to an object and the .current property allows you to access its instance. It is what you do with useRef that matters.

The core usage of useRef hook is to store reference of element.

function TextInput() {
  const theInput = useRef();

  const onClick = () => {
    theInput.current.focus();
  };

  return (
    <>
      <input ref={theInput} type="text" />
      <button onClick={onClick}>
        CLICK ME TO FOCUS IN THE INPUT WITHOUT CLICKING THE INPUT ITSELF BUT ME,
        THE BUTTON!
      </button>
    </>
  );
}
Enter fullscreen mode Exit fullscreen mode

What's happening in this code snippet above is that we've got a text input and right below that a button. We know that the text input will get focused when clicked but that is not the concern here. The challenge is to focus the text input when the button (another element) is clicked. How?

There are just 3 easy steps you need to follow. First, call useRef and get the value, in this case "theInput". Then we need to connect that value to any element, in this case the input element by writing (ref={theInput}). At this point, "theInput" and element in connected, or in other words, "theInput" now refers the input element. Finally, we can change the state of the input element to be focused, because we've got a reference to it using theInput.current.focus().

Collapse
 
vnankov profile image
Valentin Nankov

Thank you very much for the clarification! So in other words useRef is like querrySelector function in the pure JS way. Please correct me if I am wrong.

Thread Thread
 
ishakmohmed profile image
Mohmed Ishak

You're right. Not to worry, usually you don't need it.

Thread Thread
 
moustachedsign profile image
Moustache Design

yes, the difference is querySelector is imperative, useRef declarative, also querySelector does a search for the string you pass to it, so you have to know that is unique and won't change.
useRef on the other hand, ties itself to that jsx element and nothing else.

Thread Thread
 
ishakmohmed profile image
Mohmed Ishak

Cool!

Collapse
 
mrtnbroder profile image
Martin Broder • Edited

I'm sorry but that's bollocks. useRef has nothing to do with the DOM. It's stated clearly on the offical docs:

useRef returns a mutable ref object whose .current property is initialized to the passed argument (initialValue). The returned object will persist for the full lifetime of the component.
Enter fullscreen mode Exit fullscreen mode

Please don't spread false information.

useRef is useful whenever you want to reference the same value on every render, but not trigger a re-render when its value changes.

Thread Thread
 
hcbartelt profile image
Hans Christian Bartelt

That's it. Thank you 👍

Thread Thread
 
ishakmohmed profile image
Mohmed Ishak • Edited

@mrtnbroder apparently you're right, my bad. I just need to remove the "DOM" part in that comment, will edit it now. That's how I always understood the useRef hook. Thanks dude.