A Comprehensive Guide to Using useRef Hook in React.js
React.js is a popular JavaScript library for building user interfaces, and one of its key features is the use of hooks to manage state and other side effects in functional components. One of the lesser-known hooks, useRef
, can be incredibly useful in a variety of scenarios, from keeping track of input focus to persisting values across renders without causing re-renders. In this comprehensive guide, we will dive deep into the useRef
hook and explore its use cases, benefits, and how to implement it in your React applications. This blog is beginner-friendly and includes detailed explanations, code examples, and answers to frequently asked questions.
Understanding useRef
Before diving into useRef
, it's essential to understand what a "ref" is in the context of React. A ref (short for reference) is a way to access the underlying DOM element or an instance of a class component in a React component. Refs are useful when you need to perform actions that are not handled by React's state management, such as focusing on an input field, reading the current value of an input, or triggering animations.
The useRef
hook is a function that creates and returns a mutable ref object, which persists throughout the entire lifetime of the component. The ref object has a single property, current
, which holds the reference value. The initial value of current
can be set by passing an argument to useRef
when it's called.
Here's a simple example of how to use useRef
:
import React, { useRef } from "react"; function App() { const inputRef = useRef(null); const handleClick = () => { inputRef.current.focus(); }; return ( <div> <input ref={inputRef} type="text" /> <button onClick={handleClick}>Focus Input</button> </div> ); } export default App;
In this example, we create a ref using useRef(null)
, which is assigned to the inputRef
variable. We then pass this ref to the input
element using the ref
prop. When the user clicks the "Focus Input" button, the handleClick
function is called, and we can access the input
element using inputRef.current
and call its focus
method.
Accessing DOM Elements with useRef
One of the most common use cases for useRef
is to access DOM elements directly. This can be useful when you need to perform actions not covered by React's state management, like focusing on an input or reading its value.
Focusing on an Input
As shown in the previous example, you can use useRef
to focus on an input field:
import React, { useRef } from "react"; function App() { const inputRef = useRef(null); const handleClick = () => { inputRef.current.focus(); }; return ( <div> <input ref={inputRef} type="text" /> <button onClick={handleClick}>Focus Input</button> </div> ); } export default App;
Reading Input Value
You can also use useRef
to read the current value of an input element:
import React, { useRef } from "react"; function App() { const inputRef = useRef(null); const handleClick = () => { alert(`Input Value: ${inputRef.current.value}`); }; return ( <div> <input ref={inputRef} type="text" /> <button onClick={handleClick}>Show Input Value</button> </div> ); } export default App;
In thisexample, when the user clicks the "Show Input Value" button, the handleClick
function is called, and we can access the input
element using inputRef.current.value
to display an alert with the current value of the input field.
Using useRef for Storing Values Across Renders
Another use case for useRef
is storing values across renders without causing re-renders. This can be helpful when you want to keep track of a value that doesn't affect the component's appearance but is needed for other purposes, such as animations or timers.
Storing Previous State Value
Suppose you want to store the previous state value to compare it with the current value. In this case, you can use useRef
along with the useEffect
hook:
import React, { useState, useEffect, useRef } from "react"; function App() { const [count, setCount] = useState(0); const prevCountRef = useRef(); useEffect(() => { prevCountRef.current = count; }, [count]); return ( <div> <p> Current count: {count} - Previous count: {prevCountRef.current} </p> <button onClick={() => setCount(count + 1)}>Increment</button> </div> ); } export default App;
In this example, we use useState
to manage the count
state, and we create a ref using useRef
to store the previous count value. We use the useEffect
hook to update the prevCountRef.current
value whenever the count
state changes. Since updating a ref does not cause a re-render, this approach avoids unnecessary re-renders while keeping track of the previous value.
useRef vs useState
You might wonder when to use useRef
instead of useState
. The main difference is that updating a ref using useRef
does not cause a re-render, while updating state using useState
does. Use useRef
when you want to store a value that doesn't affect the component's appearance but is needed for other purposes, like animations, timers, or comparisons with previous values.
On the other hand, if the stored value affects the component's appearance or triggers other side effects, you should use useState
or another state management hook.
FAQ
Can I use useRef with class components?
No, useRef is a hook, and hooks can only be used with functional components. If you need to use refs in a class component, you can use the React.createRef()
method to create a ref and assign it to an instance variable.
When should I use useRef instead of React.createRef()?
useRef
is a hook designed to be used with functional components, while React.createRef()
is a method used with class components. If you're working with a functional component, useRef is the recommended way to create and manage refs.
Can I use useRef to store state that affects the appearance of my component?
While you technically can store state in a ref, it's not recommended because updating the ref will not trigger a re-render of the component. If the stored state affects the appearance of your component, you should use useState
or another state management hook.
Is it safe to use useRef to store a value that is updated frequently?
Yes, useRef is designed to store values across renders without causing re-renders, so it's safe to use it for values that are updated frequently. However, if the updated value affects the appearance of your component or triggers other side effects, you should use useState
or another state management hook.
Free money-back guarantee
Unlimited access to all platform courses
100's of practice projects included
ChatGPT Based Instant AI Help (Jarvis)
Structured React.js/Next.js Full-Stack Roadmap To Get A Job
Exclusive community for events, workshops
Sharing is caring
Did you like what Mehul Mohan wrote? Thank them for their work by sharing it on social media.
No comments so far
Leave a question/feedback and someone will get back to you
- React Refs – A Complete Guide
- Complete guide to using React Hooks
- React useState Hook Typescript