Práctica de High-Order Components en React

Clase 13 de 19Curso de React.js: Patrones de Render y Composición

Resumen

¿Cómo crear y utilizar High-Order Components?

Los High-Order Components (HOC) son una herramienta poderosa en React que permiten ampliar la funcionalidad de los componentes de manera eficiente. Estos componentes de orden superior encapsulan lógica y comportamiento adicionales y pueden aplicarse a otros componentes para modificar o extender sus capacidades, incrementando así la modularidad y reutilización del código.

¿Cómo iniciamos con un HOC?

Primero, debemos crear un nuevo componente que recibirá un componente original, envolverá o añadirá funcionalidad y retornará un nuevo componente ampliado. En este caso, es recomendable seguir el estándar de nombrar la función con el prefijo with, como withSaludo en el ejemplo, para especificar claramente la naturaleza del HOC.

function withSaludo(WrappedComponent) {
  return function EnhancedComponent(props) {
    return (
      <React.Fragment>
        <h2>Buenas</h2>
        <WrappedComponent {...props} />
      </React.Fragment>
    );
  };
}

¿Cómo se aplica un HOC a un componente?

Una vez creado el HOC, se aplica al componente original al momento de importarlo en otro archivo. Este nuevo componente enriquece al original con la funcionalidad añadida por el HOC:

const AppWithSaludo = withSaludo(App);

¿Cómo pasamos propiedades a un HOC?

Un HOC no solo puede cambiar el aspecto o la funcionalidad, sino que también es capaz de inyectar propiedades. Es necesario asegurarse de pasar todas las propiedades recibidas al componente envuelto para mantener la reactividad:

function withSaludo(WrappedComponent) {
  return function EnhancedComponent(props) {
    return (
      <React.Fragment>
        <h2>{props.saludo || 'Hola'}</h2>
        <WrappedComponent {...props} />
      </React.Fragment>
    );
  };
}

// Uso
const AppWithSaludo = withSaludo(App);

¿Cómo se manejan estados complejos y datos externos dentro de un HOC?

Los HOC se prestan a trabajar con estados complejos, llamadas a APIs y lógica condicional. Por ejemplo, puedes incorporar un estado que administre si una llamada a una API está cargando o ha fallado, mostrar un componente de 'loading' o gestionar errores de manera global:

function withApiData(WrappedComponent) {
  return function EnhancedComponent(props) {
    const [data, setData] = React.useState(null);
    const [loading, setLoading] = React.useState(true);
    const [error, setError] = React.useState(null);

    React.useEffect(() => {
      fetchSomeData()
        .then(response => {
          setData(response.data);
          setLoading(false);
        })
        .catch(err => {
          setError(err.message);
          setLoading(false);
        });
    }, []);

    if (loading) return <div>Cargando...</div>;
    if (error) return <div>Error: {error}</div>;

    return <WrappedComponent data={data} {...props} />;
  };
}

¿Por qué utilizar HOC en React?

Los HOC son esenciales para:

  • Compartir lógica entre varios componentes sin repetir código.
  • Aumentar la modularidad y mantenimiento.
  • Implementar patrones de diseño como inyección de dependencias.
  • Crear componentes más reutilizables y versátiles.

Los High-Order Components son una de las herramientas fundamentales que cualquier desarrollador de React debería aprender a manipular, para crear aplicaciones más eficientes y escalables. Experimenta combinándolos con distintos tipos de lógica para descubrir su potencial completo y continúa ampliando tus conocimientos para crear aplicaciones más dinámicas e interactivas.