Frontend Patterns

Pattern

Prop Drilling Solution

Avoid passing props through many intermediate components unnecessarily using context or state management.

Component Beginner

Prop Drilling Solution

Problem

Deeply nested components require data from the top of the tree, forcing you to thread properties through every intermediate layer. Components that don’t need the data become coupled to it. Adding a new property means updating five or more components that simply pass it along unchanged.

Solution

Avoid passing props through multiple intermediate components by using context, composition, or state management. This reduces coupling and makes components easier to refactor.

Example

This example demonstrates using a context pattern to avoid prop drilling, allowing deeply nested components to access shared data without passing it through intermediaries.

// Framework-agnostic context pattern using custom events
class AppContext {
  constructor() {
    this.data = {};
  }

  set(key, value) {
    this.data[key] = value;
    // Broadcast change to all components listening
    document.dispatchEvent(new CustomEvent('context-update', {
      detail: { key, value }
    }));
  }

  get(key) {
    return this.data[key];
  }
}

// Global context instance accessible by all components
const appContext = new AppContext();

// Child component can access context without prop drilling
// No need to pass theme through parent components
class Header extends HTMLElement {
  connectedCallback() {
    // Access theme directly from context
    const theme = appContext.get('theme');
    this.style.color = theme.color;

    // Listen for theme updates
    document.addEventListener('context-update', (e) => {
      if (e.detail.key === 'theme') {
        this.style.color = e.detail.value.color;
      }
    });
  }
}

Benefits

  • Eliminates unnecessary coupling in intermediate components.
  • Makes refactoring easier by reducing the number of components that touch each prop.
  • Simplifies component interfaces by removing pass-through props.
  • Improves code readability by connecting data directly to where it’s used.

Tradeoffs

  • Can make data flow less explicit and harder to trace.
  • Context overuse can lead to re-render performance issues.
  • May hide dependencies, making components less self-contained.
  • Requires choosing the right level of abstraction for shared state.
Stay Updated

Get New Patterns
in Your Inbox

Join thousands of developers receiving weekly insights on frontend architecture patterns

No spam. Unsubscribe anytime.