How can you pass a ref to a child component that's not a direct descendant? Mid Level Developer
Question
How can you pass a ref to a child component that’s not a direct descendant? Mid Level Developer
Brief Answer
To pass a ref to a child component that’s not a direct descendant, you use React.forwardRef.
Why it’s Needed (The Problem)
Standard refs only work for direct parent-child relationships. If you need to access a DOM element or component instance of a *grandchild* or deeper component, you’d typically have to “prop drill” the ref through all intermediate components, which makes code cumbersome and less maintainable.
What React.forwardRef Does
React.forwardRef allows you to “forward” a ref from a parent component, through one or more intermediate components, directly to a deeply nested component’s DOM element or component instance. This creates a direct connection, bypassing the need for intermediate components to explicitly handle the ref as a prop.
How it Works
You wrap your functional component with React.forwardRef. The component’s render function then receives props and the ref as its second argument. You attach this received ref to the desired internal DOM element or custom component within your JSX.
const MyGrandchildInput = React.forwardRef((props, ref) => {
return <input ref={ref} {...props} />;
});
Key Use Cases
- Programmatically managing focus (e.g., on a deeply nested input).
- Integrating with third-party libraries that require direct DOM access.
- Triggering imperative animations or actions on a specific element.
Interview Tip
When asked, first explain the problem of “prop drilling” with refs and why standard refs are limited. Then, introduce React.forwardRef as the elegant solution, detailing how it works and providing a practical real-world use case to demonstrate your understanding.
Super Brief Answer
You use React.forwardRef.
It allows a parent component to pass a ref through multiple layers of intermediate components directly to a deeply nested DOM element or component instance.
This avoids “prop drilling” and is crucial for imperative interactions like managing focus, integrating third-party libraries, or triggering animations on elements that are not direct children.
Detailed Answer
In React, React.forwardRef is a powerful technique that allows you to pass a ref from a parent component down to a child component that is not a direct descendant (e.g., a grandchild or deeper). This mechanism enables the parent to directly access the underlying DOM element or component instance of the deeply nested child, effectively bypassing the need to “prop drill” the ref through intermediate components. It’s crucial for scenarios requiring direct interaction with specific DOM elements, such as managing focus, animations, or integrating third-party libraries.
Understanding the Problem: Prop Drilling with Refs
Imagine a component tree where a ParentComponent needs to access the DOM element of a GrandchildComponent (e.g., Parent > Child > Grandchild). Without React.forwardRef, you would typically create a ref in the ParentComponent, pass it as a prop to the ChildComponent, and then the ChildComponent would, in turn, pass it down as a prop to the GrandchildComponent.
This process, often referred to as “prop drilling,” can quickly become cumbersome and make your code harder to read and maintain, especially in complex applications with many layers of nesting. It forces intermediate components to be aware of and pass down props they don’t directly use, violating principles like component encapsulation and clarity. React.forwardRef provides an elegant solution by creating a direct connection for the ref between the originating parent and the targeted deeply nested component, streamlining the process and improving code manageability.
What is React.forwardRef?
React.forwardRef is a React API function that allows components to expose a ref that was passed to them from a parent component. It takes a render function as an argument, which in turn receives props and the ref as its arguments. The component returned by this render function can then attach the received ref to any internal DOM element or component instance.
This effectively “forwards” the ref from the initial parent down to the specific element or component within the deeply nested structure, enabling direct access from the parent.
Key Use Cases for Forwarding Refs
React.forwardRef is particularly useful in situations where direct interaction with a deeply nested DOM element or component instance is necessary. Common use cases include:
- Integrating with Third-Party Libraries: Many UI libraries (e.g., rich text editors, date pickers, animation libraries) require a
refto their root element for initialization, custom positioning, or specific functionalities.forwardRefallows you to seamlessly pass a ref to these libraries even if they are wrapped within several layers of your own components. - Managing Focus: Programmatically setting focus on an input field or button deep within a complex form or modal can be challenging.
forwardRefenables you to directly access the target element to call itsfocus()method. - Text Selection: Similar to focus management,
forwardReffacilitates direct manipulation of text selection within an input or textarea element. - Animations and Transitions: For complex animation scenarios that require direct DOM manipulation (e.g., measuring dimensions, setting styles),
forwardRefprovides the necessary access to the target element. - Imperative Actions: When you need to trigger a specific method on a child component instance from a parent (e.g., a
resetForm()method on a deeply nested form component),forwardRefcan provide access to that component instance.
Implementing React.forwardRef
To implement React.forwardRef, you wrap your functional component definition with the React.forwardRef call. The inner function receives props and the ref itself. You then attach this ref to the desired DOM element or custom component within your component’s JSX.
Syntax:
const MyComponent = React.forwardRef((props, ref) => {
return <div ref={ref} {...props}>Hello World</div>;
});
Here, MyComponent can now accept a ref from its parent, and that ref will be attached to the div element it renders.
Code Example: Forwarding a Ref to a Grandchild Component
This example demonstrates how a ParentComponent can directly access an <input> element inside a GrandchildComponent by forwarding the ref through an intermediate ChildComponent.
import React, { useRef, useEffect } from 'react';
// Grandchild is the component whose DOM element we want to access
const GrandchildComponent = React.forwardRef((props, ref) => {
// The forwarded ref is attached to the input element
return <input type="text" ref={ref} {...props} placeholder="Focus me!" />;
});
// Child component does NOT consume the ref directly, it forwards it
const ChildComponent = React.forwardRef((props, ref) => {
// Child renders Grandchild, attaching the forwarded ref
return (
<div>
<h3>Child Component</h3>
<GrandchildComponent ref={ref} {...props} />
</div>
);
});
function ParentComponent() {
const grandchildInputRef = useRef(null);
React.useEffect(() => {
// Accessing the grandchild's DOM element directly via the forwarded ref
if (grandchildInputRef.current) {
console.log("Grandchild input element:", grandchildInputRef.current);
grandchildInputRef.current.focus(); // Programmatically focus the input
grandchildInputRef.current.value = "Ref Focused!";
}
}, []); // Run once on mount
// Parent renders Child, passing the ref down
return (
<div>
<h2>Parent Component</h2>
<ChildComponent ref={grandchildInputRef} />
</div>
);
}
// Example Usage:
// <ParentComponent />
In this example:
ParentComponentcreates aref(grandchildInputRef).- It passes this
reftoChildComponent. ChildComponentis wrapped withReact.forwardRef, allowing it to receive therefas its second argument. It then passes thisrefdirectly toGrandchildComponent.GrandchildComponentis also wrapped withReact.forwardRef. It receives therefand attaches it to its internal<input>element.- Now, the
ParentComponentcan directly manipulate the<input>element withinGrandchildComponentviagrandchildInputRef.current.
Interview Preparation: Demonstrating Your Knowledge
When discussing React.forwardRef in an interview, aim to showcase a clear understanding of the problem it solves and its practical applications.
-
Emphasize the Difference Between Refs and ForwardRefs:
Start by explaining that standard
refsare designed for direct parent-child relationships. If you attempt to attach a regular ref to a component that is not a direct child, it will typically benullor not behave as expected. Then, introduceforwardRefas the specific solution for this limitation, enabling refs to traverse deeper component hierarchies.- Tip: Be prepared to outline the “prop drilling” problem and how
forwardRefalleviates it, leading to cleaner, more maintainable code. A simple conceptual diagram or a quick explanation of a three-level component structure (Parent > Child > Grandchild) can be very effective.
- Tip: Be prepared to outline the “prop drilling” problem and how
-
Connect
forwardRefsto Real-World Use Cases:Describe a scenario where you personally used
forwardRefto solve a problem. For example: “In a recent project, we integrated a third-party rich text editor. This editor required arefto its container for various functionalities like image uploads and custom toolbar positioning. Our component structure was quite complex, with several layers between the main component and the rich text editor. Initially, we tried passing therefdown through props, but this quickly became messy and hard to manage.React.forwardRefallowed us to directly pass therefto the editor component, significantly simplifying the integration and making the code much cleaner and more robust.”
By articulating both the technical mechanics and the practical benefits through real-world examples, you demonstrate a comprehensive understanding of React.forwardRef.

