DOM Interactions - useRef
by Tomas Trescakยท Advanced React

Root Folder
Not Attempted
NameProgress
Introduction
Not Read
๐Ÿฐ Player
Not Read
Setup
Not Attempted
NameProgress
Software Installation
Not Read
Project Setup
Not Read
Running and Testing
Not Read
React and ReactDOM
Not Read
๐Ÿ’ก Assignment 1: Welcome Message
Not Attempted
Submissions
Not Read
React
Not Attempted
NameProgress
JSX and Components
Not Read
Props
Not Read
๐Ÿ‘พ Exercise: Props
Not Attempted
CSS Styles
Not Read
useState and Hooks
Not Read
๐Ÿ‘พ Exercise: useState
Not Attempted
Conditional Rendering
Not Read
Lists
Not Read
๐Ÿ‘พ Exercise: Lists
Not Attempted
Forms and Events
Not Read
๐Ÿ‘พ Exercise: Forms
Not Attempted
๐Ÿ’ก Assignment 2: Front End
Not Attempted
Pure Components - memo
Lifecycle - useEffect
Expensive? - useMemo
DOM Interactions - useRef
forwardRef
useImperativeHandle
๐Ÿ‘พ useImperativeHandle
Not Attempted
Context
useCallback
useId
useReducer
Infrastructure
Not Attempted
NameProgress
Database
Not Read
NextAuth and Github Authentication
Not Read
Prisma and ORM
Not Read
Project Setup
Not Read
Project Authentication
Not Read
APIs
Not Attempted
NameProgress
APIs
Not Read
APIs - Slides
Not Attempted
Rest APIs
Not Read
Rest APIs - Express.js
Not Read
ReastAPIs - Next.js
Not Read
Securing APIs
Not Read
Securing APIs - NextAuth
Not Read
tRPC
Not Attempted
NameProgress
tRPC
Not Read
tRPC - Routers
Not Read
tRPC - Server Rendering
Not Read
tRPC - Client Rendering
Not Read
Persisting Data
Not Read
Assignment 3: APIs
Not Read
0 / 300 XP

Lecture Transcript
If you prefer text to video, check out the transcript of the presentation above

The useRef hook in React provides a way to persist values across renders without causing a re-render. It is primarily used for:

Accessing DOM elements (like input fields or divs).

Storing mutable values that do not trigger re-renders. LEt's take a look at some common uses of useRef.

Let's talk about some key points about useRef.

useRef returns a mutable object with a current property.

The current property can hold either a DOM element reference or a mutable value that persists across renders.

The most common use of useRef is to access the DOM elements.

useRef(null) creates a reference object.

The ref attribute assigns the DOM node to inputRef-current.

In useEffect, after the component renders in the browser, inputRef-current-focus focuses the input field.

You can use useRef to store a value that does not trigger re-renders when updated. How it works?

useRef holds the value of renderCount and persists it across renders. You can see that the initial value is two, since we run React in Strict development mode, which renders each component twice. In production, this would be 1.

Updating renderCount.current does not trigger a re-render.

Clicking the button only triggers a re-render due to state (setCount), and renderCount continues to persist.

You can use useRef to store the previous value of a prop or state. How it work?

useRef stores the previous value of count

useEffect updates prevCount-current after every render

The previous value persists across renders without causing additional updates

To summarise. useRef is similar to useState as it preserves the value across multiple re-renders, the main difference is that storing value in ref does not cause re-renders. useRef is versatile for DOM access, storing values, and tracking previous states. Consequently, it helps optimise performance by avoiding unnecessary re-renders.

Description
All the extra information about this section

Understanding useRef in React

The useRef hook in React provides a way to persist values across renders without causing a re-render. It is primarily used for:

  1. Accessing DOM elements (like input fields or divs).
  2. Storing mutable values that do not trigger re-renders.

Key Points About useRef

  • useRef returns a mutable object with a current property:
     

    const myRef = useRef(initialValue);
    
  • The current property can hold:
    • A DOM element reference.
    • A mutable value that persists across renders.

Example 1: Accessing DOM Elements

This is the most common use case for useRef.

Code Example:

import React, { useRef, useEffect } from "react";

const DomRefDemo = () => {
  const inputRef = useRef(null);

  useEffect(() => {
    // Focus the input field on component mount
    inputRef.current.focus();
  }, []);

  return (
    <div>
      <h1>useRef Example: DOM Access</h1>
      <input ref={inputRef} type="text" placeholder="I will be focused on load" />
    </div>
  );
};

export default DomRefDemo;

How It Works:

  1. useRef(null) creates a reference object.
  2. The ref attribute assigns the DOM node to inputRef.current.
  3. In useEffect, inputRef.current.focus() focuses the input field.

Example 2: Storing Mutable Values Without Re-rendering

You can use useRef to store a value that does not trigger re-renders when updated.

Code Example:

import React, { useRef, useState } from "react";

const MutableRefDemo = () => {
  const renderCount = useRef(1);
  const [count, setCount] = useState(0);

  // Increment renderCount on each re-render
  renderCount.current += 1;

  return (
    <div>
      <h1>useRef Example: Mutable Values</h1>
      <p>Component Re-rendered: {renderCount.current} times</p>
      <p>State Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment Count</button>
    </div>
  );
};

export default MutableRefDemo;

How It Works:

  1. useRef holds the value of renderCount and persists it across renders.
  2. Updating renderCount.current does not trigger a re-render.
  3. Clicking the button only triggers a re-render due to state (setCount), and renderCount continues to persist.

Example 3: Preserving Previous State or Value

You can use useRef to store the previous value of a prop or state.

Code Example:

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

const PreviousValueDemo = () => {
  const [count, setCount] = useState(0);
  const prevCount = useRef(count);

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

  return (
    <div>
      <h1>useRef Example: Preserve Previous State</h1>
      <p>Current Count: {count}</p>
      <p>Previous Count: {prevCount.current}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
};

export default PreviousValueDemo;

How It Works:

  1. useRef stores the previous value of count.
  2. useEffect updates prevCount.current after every render.
  3. The previous value persists across renders without causing additional updates.

When to Use <strong>useRef</strong>

  1. Accessing DOM elements: For direct manipulation of DOM nodes.
  2. Storing values: To persist mutable values across renders without triggering re-renders.
  3. Tracking previous values: Store and retrieve prior state/props.

Key Differences Between useRef and useState:

FeatureuseRefuseState
Triggers Re-renderโŒ Noโœ… Yes
Mutableโœ… Yes (via current)โœ… Yes (but causes re-render)
UsageDOM access, persisting valuesState management, triggering re-renders

Summary

  • useRef is versatile for DOM access, storing values, and tracking previous states.
  • It helps optimize performance by avoiding unnecessary re-renders.

Let me know if you need more examples or further explanation! ๐Ÿš€

Maggie

Discuss with Maggie
Use the power of generative AI to interact with course content

Discussion

0 comments
Loading editor ...
Remember to be polite and report any undesirable behaviour

Category

Empty

Labels

Discussion has no labels

1 participant

user avatar

Priority

Notifications

You're not receiving notifications from this thread.
Course Outline