Contenido del curso
Maquetación con React.js
Interacción con React.js
Librería de Iconos Personalizados
Herramientas avanzadas: escalabilidad, organización y persistencia
- 13

Persistencia de datos con localStorage en React
25:48 min - 14

Custom Hook para Local Storage en React
17:53 min - 15

Cómo organizar carpetas de componentes React
07:40 min - 16

Feature-First Directories en React
09:12 min - 17

Tips para naming y abstracción de componentes React
12:24 min - 18

useEffect para controlar renders costosos
14:04 min - 19

Estados de carga y error
Viendo ahora - 20
![[]](https://thumbs.cdn.mdstrm.com/thumbs/512e13acaca1ebcd2f000279/thumb_6449ac11a2423e6ce31f42d7_6449ac11a2423e6ce31f42e2_98s.jpg)
[]
16:19 min - 21

Loading Skeletons animados en React con CSS
11:59 min - 22

¿Qué es React Context?
20:57 min - 23

useContext
10:47 min - 24

¿Qué son los React Portals?
14:03 min - 25

Toggle de modales con estado previo en React
03:33 min - 26

Formularios en React sin recargar página
15:08 min - 27

Cómo crear addTodo con Context API
15:15 min
Deploy
Próximos pasos: React #UnderTheHood
Bonus: creando proyectos en React desde cero
Estados de carga y error
Resumen
¿Cómo implementar estados de carga y error en una aplicación React usando hooks?
En las aplicaciones web actuales, los estados de carga y error son vitales para mejorar la experiencia del usuario, pues permiten informar al usuario sobre lo que ocurre en segundo plano. En este artículo, exploraremos cómo implementar estos estados de forma efectiva en una aplicación React utilizando un Custom Hook.
¿Cómo simular un retraso en el almacenamiento local?
Simular un retraso en la obtención de datos de localStorage nos ayuda a comprender cómo manejar datos asincrónicos en nuestra aplicación. Aunque localStorage suele ser rápido y síncrono, es relevante aprender a gestionar posibles demoras. Para lograr esto:
- Usamos
setTimeoutpara encapsular llamadas dentro de un retardo predefinido (por ejemplo, dos o tres segundos). - Devolvemos los datos simulando que provienen de una fuente asincrónica.
const useLocalStorage = (key, initialValue) => { const [storedValue, setStoredValue] = React.useState(initialValue); React.useEffect(() => { const retrieveData = async () => { await new Promise(resolve => setTimeout(resolve, 2000)); const item = window.localStorage.getItem(key); item ? setStoredValue(JSON.parse(item)) : setStoredValue(initialValue); }; retrieveData(); }, [initialValue, key]); return [storedValue, setStoredValue]; };
¿Cómo manejar estados de carga y error?
Para mantener a los usuarios informados sobre la carga y posibles errores:
- Creamos dos estados mediante el hook
useState:loadingyerror. loadinginicializa atruey cambia afalsecuando los datos han sido cargados.errorse inicializa enfalse, cambiando atrueen caso de ocurrir un error.
const [loading, setLoading] = React.useState(true); const [error, setError] = React.useState(false); React.useEffect(() => { async function fetchData() { try { // Simular retraso await new Promise((resolve) => setTimeout(resolve, 2000)); const item = window.localStorage.getItem(key); // Manejar datos item ? setStoredValue(JSON.parse(item)) : setStoredValue(initialValue); } catch (err) { setError(true); } finally { setLoading(false); } } fetchData(); }, [key, initialValue]);
¿Cómo mostrarlos en la interfaz?
Finalmente, mostramos mensajes adecuados según el estado:
- Cargando: Mostramos un mensaje simple como "Estamos cargando..."
- Error: Usamos un mensaje llamativo para indicar problemas, como "¡Hubo un error!"
- Sin elementos: Cuando el array está vacío, indicamos al usuario que puede empezar a añadir elementos.
return ( <div> {loading && <p>Estamos cargando...</p>} {error && <p>¡Hubo un error!</p>} {!loading && !error && storedValue.length === 0 && <p>Crea tu primer todo</p>} {!loading && !error && storedValue.map(todo => <Item key={todo.id} {...todo} />)} </div> );
Recomendaciones finales
Cuando trabajamos con Custom Hooks que retornan múltiples valores, seguir las siguientes prácticas mejora la claridad de nuestro código:
- Retornar los valores dentro de un objeto en vez de un array para clarificar el significado de cada valor.
- Usar destructuración nombrada en el componente que consume el hook.
const { item, loading, error } = useLocalStorage('todos', []);
Este enfoque garantiza que nuestros componentes sean mantenibles y entendibles a largo plazo. ¡Sigue explorando y aplicando estas técnicas para optimizar la UX en tus aplicaciones React!