Skip to content

Higher Order Components

Higher order components are components that:

  • render children components
  • allow ‘render hijacking’ of children components (i.e. control rendering of children components)
  • allow manipulation of props before being passed to children components

A simple example that displays Info component with boilerplate warning message:

js
import React from 'react';
import ReactDOM from 'react-dom';

// Child component
const Info = (props) => (
  <div>
    <h1>Info Page</h1>
    <p>Info: {props.info}</p>
  </div>
);

// Wrapper function that encapsulates children components
const withAdminWarning = (WrappedComponent) => {
  return (props) => (
    <div>
      <p>These are private info. Please do not share</p>
      <WrappedComponent {...props} />
    </div>
  );
};

// Create higher order component by calling wrapper function
const AdminInfo = withAdminWarning(Info);

ReactDOM.render(
  <AdminInfo info="Secret data here" />,
  document.getElementById('root'),
);

Same example with render hijacking. Warning message and child component are rendered only when isAdmin = true:

js
const Info = (props) => (
  <div>
    <h1>Info Page</h1>
    <p>Info: {props.info}</p>
  </div>
);

const withAdminWarning = (WrappedComponent) => {
  return (props) => (
    <div>
      {props.isAdmin && <p>These are private info. Please do not share</p>}
      {props.isAdmin ? <WrappedComponent {...props} /> : <p>Forbidden</p>}
    </div>
  );
};

const AdminInfo = withAdminWarning(Info);

ReactDOM.render(
  <AdminInfo isAdmin={false} info="Secret data here" />,
  document.getElementById('root'),
);