Skip to main content

UseRef

The useRef hook in React provides a way to create and manage a mutable reference that persists across renders. It's commonly used to access or modify a DOM element directly, store a value that doesn't trigger a re-render when changed, or maintain state information between renders without causing an update.

Syntax

const ref = useRef(initialValue);`
  • initialValue: The initial value of the ref, which can be any type.
  • ref.current: The property where the current value of the ref is stored.

Common Use Cases for useRef

  1. Accessing DOM elements directly.
  2. Storing mutable values that don't need to cause re-renders (e.g., timers, previous state values).

Example 1: Accessing a DOM Element

This example demonstrates how useRef is used to access an input element directly.

import React, { useRef } from 'react';

function TextInputFocus() {
// Create a ref for the input element
const inputRef = useRef(null);

const focusInput = () => {
// Focus the input element using the ref
inputRef.current.focus();
};

return (
<div>
<input ref={inputRef} type="text" placeholder="Click the button to focus" />
<button onClick={focusInput}>Focus Input</button>
</div>
);
}

export default TextInputFocus;`

Explanation

  • Creating a Ref: inputRef is created using useRef and assigned to the <input> element.
  • Accessing the Element: inputRef.current is used to access the DOM element, allowing focusInput to call .focus() on it when the button is clicked.

Example 2: Storing a Mutable Value

Here, useRef is used to store the previous value of a state variable without triggering re-renders.

import React, { useState, useEffect, useRef } from 'react';

function PreviousCounter() {
const [count, setCount] = useState(0);
const prevCountRef = useRef(0); // Initialize ref to store previous count

useEffect(() => {
// Update the ref with the current count after every render
prevCountRef.current = count;
}, [count]);

return (
<div>
<h1>Current Count: {count}</h1>
<h2>Previous Count: {prevCountRef.current}</h2>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}

export default PreviousCounter;`

Explanation

  • prevCountRef: Holds the previous count value across renders.
  • Effect to Update prevCountRef: After every render, the useEffect updates prevCountRef.current with the latest count, providing access to the previous value without causing re-renders.