DEV Community

Abhay Singh Kathayat
Abhay Singh Kathayat

Posted on

Understanding Refs and the DOM in React: Accessing and Manipulating DOM Elements

Refs and the DOM in React: Accessing and Manipulating DOM Elements

In React, refs are used to access and interact with DOM elements directly. While React typically manages the DOM in a declarative way through state and props, there are times when you may need to interact with the DOM directly, such as for animations, form field focus, or measuring element dimensions. In these cases, refs provide a way to access the underlying DOM nodes.


1. What are Refs in React?

A ref (short for reference) is an object that allows you to refer to a DOM element or a React component instance. Refs can be created using React.createRef() in class components or useRef() in function components. Refs are typically used to:

  • Access the DOM directly (for example, focusing an input field or getting the value of a form element).
  • Trigger imperative animations or actions.
  • Integrate with third-party libraries that require direct DOM manipulation.

2. Creating and Using Refs

In Class Components:

In class components, refs are created using React.createRef(). The created ref is then attached to a DOM element via the ref attribute.

Example of Refs in Class Components:

import React, { Component } from 'react';

class MyComponent extends Component {
  constructor(props) {
    super(props);
    // Create a ref to access the input element
    this.inputRef = React.createRef();
  }

  handleFocus = () => {
    // Access the DOM node directly and focus the input element
    this.inputRef.current.focus();
  };

  render() {
    return (
      <div>
        <input ref={this.inputRef} type="text" />
        <button onClick={this.handleFocus}>Focus Input</button>
      </div>
    );
  }
}

export default MyComponent;
Enter fullscreen mode Exit fullscreen mode

In this example:

  • this.inputRef is created using React.createRef().
  • The ref is assigned to the <input /> element via the ref attribute.
  • In the handleFocus method, we access the input element via this.inputRef.current and call focus() to programmatically focus the input field.

In Function Components:

In function components, refs are created using the useRef hook. The useRef hook allows you to create a mutable reference object that persists across re-renders.

Example of Refs in Function Components:

import React, { useRef } from 'react';

const MyComponent = () => {
  const inputRef = useRef();

  const handleFocus = () => {
    // Access the DOM node directly and focus the input element
    inputRef.current.focus();
  };

  return (
    <div>
      <input ref={inputRef} type="text" />
      <button onClick={handleFocus}>Focus Input</button>
    </div>
  );
};

export default MyComponent;
Enter fullscreen mode Exit fullscreen mode

In this example:

  • inputRef is created using the useRef hook.
  • The ref is attached to the <input /> element using the ref attribute.
  • The handleFocus function accesses the input element using inputRef.current and calls focus() to focus the input field.

3. Use Cases for Refs

a. Accessing DOM Elements

Refs are commonly used to access and manipulate DOM elements directly. For example, focusing on a text input or measuring the size of an element can be easily done with refs.

b. Managing Focus

Refs allow you to manage focus for elements, such as focusing on an input field when a component mounts or after a certain action.

Example of Managing Focus with Refs:

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

const FocusInput = () => {
  const inputRef = useRef();

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

  return <input ref={inputRef} type="text" />;
};

export default FocusInput;
Enter fullscreen mode Exit fullscreen mode

In this example, the input is automatically focused when the component mounts, thanks to the useEffect hook and the ref.

c. Triggering Animations or Integrating with Third-Party Libraries

Refs are often used to interact with third-party libraries or trigger imperative animations. For example, you might use a ref to control a custom animation or interact with a non-React library like jQuery.

d. Form Validation

Refs can also be used to gather form data without storing the data in React's state, providing a simple alternative for forms that do not need real-time updates.


4. Managing Refs for Multiple Elements

When working with multiple elements, you can store refs in an object or array to access each element.

Example of Refs for Multiple Elements:

import React, { useRef } from 'react';

const MultipleRefs = () => {
  const inputRefs = [useRef(), useRef(), useRef()];

  const focusInput = (index) => {
    inputRefs[index].current.focus();
  };

  return (
    <div>
      <input ref={inputRefs[0]} type="text" />
      <input ref={inputRefs[1]} type="text" />
      <input ref={inputRefs[2]} type="text" />
      <button onClick={() => focusInput(1)}>Focus Second Input</button>
    </div>
  );
};

export default MultipleRefs;
Enter fullscreen mode Exit fullscreen mode

In this example, multiple input elements are managed using an array of refs, and a button is used to focus the second input.


5. Refs vs State

While refs provide a way to interact with the DOM, state in React is used for managing data that affects the rendering of the UI. It's important to understand when to use each:

  • State is used for dynamic rendering: When data changes and affects how the UI should be rendered, use state.
  • Refs are used for imperative actions: When you need to directly interact with DOM elements (e.g., focusing, measuring, or triggering animations), use refs.

6. Conclusion

Refs in React are a powerful feature for accessing and manipulating DOM elements directly. They provide an imperative way to interact with the UI, enabling operations like focusing input fields, triggering animations, or integrating with third-party libraries.

While React encourages declarative approaches with state and props, refs serve as an essential tool when you need to perform more direct interactions with the DOM.

Top comments (0)