Introducci贸n a React y Preparaci贸n del Entorno

1

Aprende React: Desarrollo Web y Mobile Eficiente y Escalable

Fundamentos de Componentes y JSX

2

Creaci贸n de Componentes con JavaScript y React

3

Creaci贸n de Componentes Reutilizables con Props en React

Quiz: Fundamentos de Componentes y JSX

Manejo del Estado y Hooks B谩sicos

4

Estado Local en React: Uso de useState para Contadores

5

Creaci贸n y manejo de estados en un Toggle Button con React

6

Eventos y manejo de estado en React: name form interactivo

7

Uso de useEffect para Manejar Efectos Secundarios en React

Quiz: Manejo del Estado y Hooks B谩sicos

Estilizaci贸n de Componentes

8

Estilos en React: CSS, SaaS y M贸dulos CSS

9

Estilos en L铆nea en React: Uso y Mejores Pr谩cticas

10

Creaci贸n de Botones Reactivos con Styled Components en React

11

Instalaci贸n y Uso de Tailwind CSS en Proyectos Web

Quiz: Estilizaci贸n de Componentes

Trabajo con Datos y APIs

12

Creaci贸n de Componentes con Datos Est谩ticos en React

13

Creaci贸n de un Componente User List con Fetch en React

14

Manejo de Errores y Carga en Fetch para Componentes React

15

Optimizaci贸n de Fetch con useEffect y Dependencias en React

Quiz: Trabajo con Datos y APIs

Componentes Avanzados y Estado Global

16

Manejo de estados complejos en React con useReducer

17

Context API en React: Manejo de Estados Globales y Proveedores

18

Creaci贸n de Hooks Personalizados en React para Contadores Reutilizables

19

Optimizaci贸n de Componentes en React con React.memo y Hooks

Quiz: Componentes Avanzados y Estado Global

Introducci贸n a TypeScript en React

20

Componentes con TypeScript en React: Tipado de Props y Funciones

21

Tipado de Estados y Funciones en TypeScript para React

22

Tipado de useReducer y Context API en TypeScript

Quiz: Introducci贸n a TypeScript en React

Nuevas Caracter铆sticas de React 19

23

Novedades y Mejoras en React 19 para Desarrolladores

24

Fundamentos y Actualizaci贸n Continua en React

No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Curso de React.js

Curso de React.js

Estefany Aguilar

Estefany Aguilar

Manejo de Errores y Carga en Fetch para Componentes React

14/24
Recursos

La gesti贸n de estados de carga y errores es fundamental para crear aplicaciones web robustas y amigables con el usuario. Cuando realizamos peticiones a APIs externas, siempre existe la posibilidad de que la respuesta tarde m谩s de lo esperado o que ocurra alg煤n error. Implementar un manejo adecuado de estos escenarios no solo mejora la experiencia de usuario, sino que tambi茅n hace que nuestra aplicaci贸n sea m谩s resiliente y profesional.

驴C贸mo implementar estados de carga y manejo de errores en React?

Cuando trabajamos con peticiones as铆ncronas en React, es crucial proporcionar retroalimentaci贸n visual al usuario sobre lo que est谩 sucediendo. Esto implica mostrar indicadores de carga mientras se espera la respuesta y mensajes de error claros cuando algo sale mal.

Para implementar esta funcionalidad, seguiremos estos pasos:

  1. Crear estados locales para controlar la carga y los errores.
  2. Implementar componentes visuales para cada estado.
  3. Utilizar try/catch para manejar posibles errores en las peticiones.
  4. Actualizar los estados seg煤n corresponda durante el ciclo de vida de la petici贸n.

Configuraci贸n de estados para carga y errores

Lo primero que necesitamos es definir estados que nos permitan controlar cu谩ndo mostrar los indicadores de carga y los mensajes de error:

const [isLoading, setIsLoading] = useState(true);
const [error, setError] = useState(null);

Observa que utilizamos el prefijo "is" para el estado de carga, lo que indica claramente que se trata de un valor booleano. Inicialmente, establecemos isLoading como true porque queremos mostrar el indicador de carga desde el principio, antes de que se complete la petici贸n.

Para el estado de error, comenzamos con null, lo que indica que no hay errores inicialmente. Si ocurre alg煤n problema durante la petici贸n, actualizaremos este estado con la informaci贸n del error.

Creaci贸n de componentes condicionales

Una vez que tenemos nuestros estados, podemos crear componentes condicionales que se mostrar谩n seg煤n el estado actual:

if (isLoading) {
  return <p>Cargando...</p>;
}

if (error) {
  return <p>Error: {error}</p>;
}

Estos componentes son simples, pero en una aplicaci贸n real podr铆an ser m谩s elaborados, utilizando bibliotecas de componentes o dise帽os personalizados. Lo importante es que proporcionan retroalimentaci贸n clara al usuario sobre lo que est谩 sucediendo.

Implementaci贸n de la petici贸n con manejo de errores

Para realizar la petici贸n de manera segura, utilizaremos una funci贸n as铆ncrona con try/catch:

const fetchUsers = async () => {
  try {
    const response = await fetch('https://api.example.com/users');
    
    if (!response.ok) {
      throw new Error('Error al obtener los datos');
    }
    
    const data = await response.json();
    setUsers(data);
  } catch (error) {
    setError(error);
  } finally {
    setIsLoading(false);
  }
};

Esta estructura nos permite:

  1. Intentar realizar la petici贸n dentro del bloque try.
  2. Capturar cualquier error que ocurra en el bloque catch.
  3. Finalizar siempre ejecutando el c贸digo del bloque finally, independientemente de si la petici贸n tuvo 茅xito o fall贸.

Verificaci贸n de respuestas exitosas

Un aspecto importante es verificar que la respuesta sea exitosa antes de procesar los datos:

if (!response.ok) {
  throw new Error('Error al obtener los datos');
}

Esta comprobaci贸n es crucial porque incluso si la petici贸n se completa sin errores t茅cnicos, el servidor podr铆a responder con un c贸digo de estado que indique un problema (como 404 o 500). Al lanzar un error en este caso, nos aseguramos de que se active el bloque catch y se actualice el estado de error.

驴Por qu茅 es importante implementar estos estados en nuestras aplicaciones?

La implementaci贸n de estados de carga y manejo de errores ofrece m煤ltiples beneficios:

  1. Mejora la experiencia de usuario: Los usuarios reciben retroalimentaci贸n inmediata sobre lo que est谩 sucediendo.
  2. Previene fallos en la aplicaci贸n: En lugar de que la aplicaci贸n se rompa cuando ocurre un error, mostramos un mensaje informativo.
  3. Facilita la depuraci贸n: Los mensajes de error claros ayudan a identificar y solucionar problemas.
  4. Aumenta la confiabilidad: Una aplicaci贸n que maneja correctamente los errores se percibe como m谩s profesional y confiable.

Optimizaci贸n de la experiencia de usuario

Cuando implementamos correctamente estos estados, la secuencia de interacci贸n del usuario es fluida:

  1. El usuario llega a la p谩gina y ve inmediatamente un indicador de carga.
  2. Si la petici贸n tiene 茅xito, el indicador desaparece y se muestra el contenido.
  3. Si ocurre un error, se muestra un mensaje claro que explica el problema.

Esta transparencia en el proceso de carga de datos genera confianza en los usuarios y reduce la frustraci贸n que podr铆a causar una p谩gina en blanco o un error no manejado.

El manejo adecuado de estados de carga y errores es una pr谩ctica esencial en el desarrollo de aplicaciones web modernas. No solo mejora la experiencia del usuario, sino que tambi茅n hace que nuestras aplicaciones sean m谩s robustas y profesionales. 驴Has implementado estas t茅cnicas en tus proyectos? Comparte tu experiencia en los comentarios.

Aportes 8

Preguntas 0

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

Se debe agregar ".message" para mostrar el error ya que es un objeto: ```js if(error) { return

Error: {error.message}

} ```
Cabe recalcar que tienen que poner el "UserListWithLoading.jsx" en el archivo "App.jsx" para ver los cambios. Si quieren ver el "Cargando" o al "Error" lo que pueden hacer es modificar la URL del API (ah铆 les aparecer谩 primero "Cargando" y luego aparecer谩 el "Error..."). **A帽adiendo el componente"*UserListWithLoading*" a "*App.jsx*":** ![](https://static.platzi.com/media/user_upload/image-496e2c7e-20c0-4221-9cae-e9d56df06cfe.jpg) **Luego, en el archivo "UserListWithLoading.jsx" modifique la URL a su gusto para que les aparezca el error:** ![](https://static.platzi.com/media/user_upload/image-0974b514-80d5-4188-a864-ca1ac2590c59.jpg) **Algo as铆 les saldr谩 (as铆 me sali贸):** ![]()![]()![]()![](https://gifyu.com/image/bzB76)![](https://s6.gifyu.com/images/bzB76.gif)
Una alternativa para loading puede ser incluirlo dentro del return principal para mostrar el titulo desde el principio. ![](https://static.platzi.com/media/user_upload/image-07476948-53b6-4ef3-b79d-ca36e650a84c.jpg) ![](https://static.platzi.com/media/user_upload/image-3ab53c63-1a90-4751-aaa7-469c78c3cc89.jpg)
Con AXIOS ```js /* src/hooks/useFetch.js */ //Usando axios import {useState, useEffect, useCallback} from "react" import axios from "axios" function useFetch(url){ const [data, setData] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const fetchData = useCallback( async () => { setLoading(true) setError(null) try { const response = await axios.get(url) setData(response.data) } catch (error) { setError(error) }finally{ setLoading(false) } }, [url]) useEffect(() => { fetchData() }, [fetchData]) return { data, loading, error, reload: fetchData } } export default useFetch ```
Se debe agregar si es diferente a null en la sentencia if. ```js if (!error) { return

Error: {error.message}

} ```
asi se ve cuando esta cargando ![](https://static.platzi.com/media/user_upload/image-1b7fe538-a02d-4940-ba05-ebb3399106ba.jpg)despues asi se ve si no cargar ![](https://static.platzi.com/media/user_upload/image-4e8fc70a-3119-47e9-afb8-28ba9a72a91c.jpg)y por ultimo asi se ve cargando ![](https://static.platzi.com/media/user_upload/image-e425b3af-ff23-4d38-b96d-1af6ea67444a.jpg)y por si alguien le intesa copiar el codigo ```js import React, { useState, useEffect } from 'react'; const UserListWhitLoading = () => { const [users,setUsers] = useState([]); const [isLiading,setIsLoading] = useState(true); const [error,setError ] = useState(null); useEffect(() => { const fetchUsers = async () => { try { const response= await fetch('https://jsonplaceholder.typicode.com/users') if(!response.ok){ throw new Error("Error al obtener los datos"); } const data = await response.json(); setUsers(data); }catch(error){ setError("Error fetching data"); }finally{ setIsLoading(false); } } fetchUsers(); },[]) if(isLiading){ return
Cargando...
} if(error){ return
{error}
} return(
<h1 class="text-3xl">Lista de usuarios
    { users.map((user)=>(
  • {user.name}
  • ))}
); } export default UserListWhitLoading; ```tengo que mencionar qeu si no les funciolanal las clases solo tendrian que ocupar tailwind y funcproblemas funcionara para qeu se ven lso coloes verde de cargando y morado
Hola #ReactLearners, les comparto esta mejora para poder ver el "Loading...." en acci贸n, les ayudara mucho a entender el ejercicio: ```js import React, { useEffect, useState } from 'react'; const UserList = () => { const [isLoading, setIsLoading] = useState(false); const [users, setUsers] = useState([]); useEffect(() => { setIsLoading(true); setTimeout(() => { fetch('https://jsonplaceholder.typicode.com/users') .then((response) => response.json()) .then((data) => { setUsers(data); setIsLoading(false); }) .catch((error) => { console.error(error); setIsLoading(false); }); }, 2000); }, []); return (

Dynamic Component

{isLoading ? (

Loading...

) : (
    {users.map((user) => (
  • {user.name}
  • ))}
)}
); }; export default UserList; ```
En caso que se quiera evitar el try-catch, una libreria que me parece muy es **await-to-js** en donde el codigo queda un poco mas facil de leer, bueno desde mi punto de vista. `const [err, response] = await to(api.post(URL, payload)); ` `if (err) { ` ``console.log(`[ERROR] The transaction is not successful, Error Detailed ${err.message}`); return; `` `}` `setData(response.data);`