Equivalent Methods for Accessing DOM Elements in React: An In-depth Analysis of Refs Mechanism

Oct 30, 2025 · Programming · 14 views · 7.8

Keywords: React Refs | DOM Access | useRef Hook | createRef | Component Communication

Abstract: This article comprehensively explores the proper methods for accessing DOM elements in React applications, with a focus on analyzing the Refs mechanism as the equivalent implementation of document.getElementById(). By comparing the differences between traditional DOM manipulation and React's declarative programming, it provides an in-depth examination of the useRef Hook in functional components, the createRef method in class components, and the usage scenarios and best practices of callback Refs. Through concrete code examples, the article demonstrates how to use Refs directly in event handling to avoid potential issues caused by direct DOM manipulation, helping developers build more robust React applications.

Challenges and Solutions for DOM Access in React

In traditional web development, document.getElementById() is the standard method for accessing specific DOM elements. However, in React's declarative programming paradigm, direct DOM manipulation often leads to state inconsistencies and performance issues. React optimizes UI updates through the virtual DOM and reconciliation algorithm, and using getElementById directly may bypass these optimization mechanisms.

Refs: The DOM Access Mechanism in React

Refs provide the ability to access DOM nodes or React elements, serving as the equivalent implementation of document.getElementById() in React. Unlike direct DOM manipulation, Refs are tightly integrated with React's component lifecycle and update mechanisms.

useRef Hook in Functional Components

In modern React development, functional components combined with Hooks have become the mainstream pattern. The useRef Hook provides the capability to create Refs in functional components:

import React, { useRef } from 'react';

function TextInput() {
  const inputRef = useRef(null);
  
  const handleFocus = () => {
    inputRef.current.focus();
  };
  
  return (
    
<input ref={inputRef} type="text" placeholder="Click button to focus" /> <button onClick={handleFocus}> Focus Input </button>
); }

In this example, useRef creates a Ref object that is attached to the input element via the ref attribute. When the button is clicked, the handleFocus function accesses the actual DOM node through inputRef.current and calls the focus() method.

Direct Ref Usage in Event Handling

A more concise approach is to use Refs directly within event handling functions:

function SearchComponent() {
  const handleSearch = () => {
    const searchInput = document.getElementById('search');
    // Or using Ref: const searchInput = searchRef.current;
    console.log('Search keyword:', searchInput.value);
  };
  
  return (
    
<input id="search" type="text" placeholder="Enter search content" /> <button onClick={handleSearch}> Search </button>
); }

Although this example demonstrates the use of getElementById, using Refs is recommended in React to maintain code consistency and maintainability.

Refs Implementation in Class Components

For class components, React provides the React.createRef() method:

class CustomForm extends React.Component {
  constructor(props) {
    super(props);
    this.emailRef = React.createRef();
    this.passwordRef = React.createRef();
  }
  
  handleSubmit = (e) => {
    e.preventDefault();
    const email = this.emailRef.current.value;
    const password = this.passwordRef.current.value;
    console.log('Submitted data:', { email, password });
  };
  
  render() {
    return (
      <form onSubmit={this.handleSubmit}>
        <input 
          ref={this.emailRef}
          type="email" 
          placeholder="Email" 
        />
        <input 
          ref={this.passwordRef}
          type="password" 
          placeholder="Password" 
        />
        <button type="submit">Login</button>
      </form>
    );
  }
}

Usage Scenarios for Callback Refs

Before React 16.3, callback Refs were the primary implementation method and are still useful in specific scenarios:

function DynamicList() {
  const itemRefs = [];
  
  const handleItemClick = (index) => {
    const item = itemRefs[index];
    item.style.backgroundColor = '#e3f2fd';
  };
  
  return (
    
    {['Item 1', 'Item 2', 'Item 3'].map((item, index) => ( <li key={index} ref={el => itemRefs[index] = el} onClick={() => handleItemClick(index)} > {item} ))}
); }

Refs and Component Communication

Refs can not only access DOM elements but also facilitate communication between components. Through React.forwardRef, parent components can access child component DOM nodes:

const CustomInput = React.forwardRef((props, ref) => {
  return (
    <input 
      ref={ref}
      {...props} 
      style={{ 
        border: '2px solid #2196f3',
        borderRadius: '4px',
        padding: '8px'
      }}
    />
  );
});

function ParentComponent() {
  const inputRef = useRef(null);
  
  useEffect(() => {
    // Auto-focus after component mounts
    inputRef.current.focus();
  }, []);
  
  return <CustomInput ref={inputRef} placeholder="Custom input" />;
}

Performance Considerations and Best Practices

When using Refs, consider the following performance optimizations and best practices:

function OptimizedComponent() {
  const containerRef = useRef(null);
  
  useEffect(() => {
    const container = containerRef.current;
    // Perform DOM operations
    container.style.transition = 'all 0.3s ease';
    
    return () => {
      // Cleanup work
      container.style.transition = '';
    };
  }, []);
  
  return <div ref={containerRef}>Optimized Component;
}

Practical Application Scenarios

Refs are particularly useful in the following scenarios:

function VideoPlayer() {
  const videoRef = useRef(null);
  
  const handlePlay = () => {
    videoRef.current.play();
  };
  
  const handlePause = () => {
    videoRef.current.pause();
  };
  
  return (
    
<video ref={videoRef} width="400" controls > <source src="video.mp4" type="video/mp4" /> </video>
<button onClick={handlePlay}>Play</button> <button onClick={handlePause}>Pause</button>
); }

Conclusion

The Refs mechanism provides a safe and efficient method for DOM access in React applications, completely replacing the traditional document.getElementById() approach. By appropriately using the useRef Hook in functional components, the createRef method in class components, and callback Refs, developers can implement necessary imperative DOM operations while maintaining the advantages of React's declarative programming. Understanding the working principles and best practices of Refs is crucial for building high-performance, maintainable React applications.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.