Aprende a diferenciar cómo y cuándo usar un Custom Hook frente a un High Order Component en React, creando un estado de loading reutilizable y claro. Verás cómo encapsular la lógica en un hook simple que cualquier componente puede consumir sin necesidad de envolverlo.
¿Qué diferencia a un custom hook de un high order component en React?
Un High Order Component envuelve o encapsula un componente dentro de otro para inyectarle funcionalidades. Un Custom Hook crea una funcionalidad basada en estado que puede ser usada por cualquier componente sin modificar su jerarquía.
Patrón HOC: envuelve un componente y aporta lógica interna compartida.
Patrón Hook: expone estado y funciones para reutilizar lógica sin envolver componentes.
En el ejemplo se replica el loader que antes se hizo con un HOC, pero ahora con un hook para simplificar la adopción de la lógica de carga.
¿Cómo se construye el hook useLoading paso a paso?
La idea es iniciar un estado local con un booleano y exponerlo junto a su setter. Debe empezar con la palabra “use” para identificarlo como hook.
Parámetro inicial booleano con valor por defecto en false.
Estado local con useState que maneja isLoading y setIsLoading.
Retorno del estado y su actualizador para usar en cualquier componente.
¿Cómo usar useLoading en UserComponent para controlar el loading?
Se consume el hook en un componente hijo para hacer render condicional y permitir que un botón cambie el estado de carga. Además, se tipa la prop de nombre.
typeUserProps={ name:string};constUserComponent:React.FC<UserProps>=({ name })=>{const{ isLoading, setIsLoading }=useLoading(false);if(isLoading){return<p>loading</p>;}return(<><p>Hello {name}</p><buttononClick={()=>setIsLoading(true)}>simulate loading</button></>);};// Uso en un componente padre<UserComponentname="DevCode"/>
Render condicional: si isLoading es true, muestra “loading”. Si no, muestra “Hello {name}”.
Interacción: el botón ejecuta onClick y llama a setIsLoading(true) para simular la carga.
Tipado: interfaz UserProps con name: string y uso de React.FunctionalComponent.
Diferencia práctica frente a HOC: antes se pasaba una prop booleana desde el envoltorio. Aquí el componente controla su estado vía hook y es más directo de reutilizar.
¿Con cuál patrón te quedas para este escenario de loading? Comenta tu preferido y por qué.
Los Custom Hooks en React son funciones que permiten reutilizar lógica de estado y efectos entre componentes. No reemplazan a los Higher-Order Components (HOCs), sino que ofrecen una forma más sencilla y elegante de gestionar la reutilización de código. Al crear un Custom Hook, puedes encapsular lógica que puede ser compartida entre múltiples componentes, facilitando la mantenibilidad y la organización del código. Su uso es ideal para manejar funcionalidades específicas sin complicar la jerarquía de componentes.
En este caso, cual seria la diferencia entre utilizar el hook de useState con el custom hook useLoading ? ya que el comportamiento que tiene es el mismo que haces con useState
El Custom Hook encapsula y abstrae la lógica relacionada con el estado para que se pueda usar en otro lados...
Entonces, useState sería para algo más local y no tan reusable, mientras que el custom hook useLoading te va a permitir usar lógica de estado en este caso en ooootros componentes (algo más reusable) 🙌🏼
Solo es pensar en que un Custom Hook es === reusabilidad ☺
Los Custom Hooks son utiles extraer la logica de los componente y mantenerlos mas limpios ademas de poder reutilizar la logica en varios sectores de la aplicacion.
Un ejemplo claro es cuando realizamos fetching de datos:
import{ useState, useEffect }from"react";importaxiosfrom"axios";functionuseFetch(url){const[data, setData]=useState(null);const[loading, setLoading]=useState(true);const[error, setError]=useState(null);useEffect(()=>{let isMounted =true;// Para evitar problemas si el componente se desmonta
axios
.get(url).then((response)=>{if(isMounted){setData(response.data);setLoading(false);}}).catch((err)=>{if(isMounted){setError(err);setLoading(false);}});return()=>{ isMounted =false;// Cleanup};},[url]);return{ data, loading, error };}// Uso del hookfunctionApp(){const{ data, loading, error }=useFetch("https://jsonplaceholder.typicode.com/posts");if(loading)return<p>Cargando...</p>;if(error)return<p>Error:{error.message}</p>;return(<ul>{data.map((post)=>(<li key={post.id}>{post.title}</li>))}</ul>);}```Tambien pueden ser utililes para manejo de formularios, animaciones, cuando necesitamos sabes ancho y alto de la pantalla etc.
Personalmente prefiero los Custom Hooks, sobre todo porque me ayudaron a estar más familiarizado con librerías de gestión de estado global como Zustand:
Para crear un useState sin usar los hooks de React, puedes implementar una función simple en JavaScript que mantenga el estado. Aquí tienes un ejemplo:
functioncreateState(initialValue){let state = initialValue;constsetState=(newValue)=>{ state = newValue;};return[()=> state, setState];}// Usoconst[getState, setState]=createState(0);console.log(getState());// 0setState(5);console.log(getState());// 5
Esta implementación permite obtener y actualizar el estado de forma similar a useState, pero sin la funcionalidad completa de React.