Práctica de High-Order Components en React
Clase 13 de 19 • Curso 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.