typescriptintermediate

Render Prop Pattern

Share stateful logic between components using the render prop pattern for maximum flexibility.

typescript
import { useState, useEffect } from 'react';

interface MousePosition {
  x: number;
  y: number;
}

export function MouseTracker({
  render,
}: {
  render: (pos: MousePosition) => React.ReactNode;
}) {
  const [pos, setPos] = useState<MousePosition>({ x: 0, y: 0 });

  useEffect(() => {
    const handler = (e: MouseEvent) => setPos({ x: e.clientX, y: e.clientY });
    window.addEventListener('mousemove', handler);
    return () => window.removeEventListener('mousemove', handler);
  }, []);

  return <>{render(pos)}</>;
}

// Usage:
// <MouseTracker render={({ x, y }) => <span>({x}, {y})</span>} />

Use Cases

  • Mouse tracking
  • Toggle logic sharing
  • Data fetching wrappers

Tags

Related Snippets

Similar patterns you can reuse in the same workflow.