Curso react nivel medio
El consumo de APIs externas es una tarea común en aplicaciones React. Para ello, podemos usar el método fetch o la biblioteca axios. Además, es importante manejar los estados de carga, éxito y error para mejorar la experiencia del usuario.
1. Uso de fetch y axios para consumir APIs
fetch es un método nativo de JavaScript que nos permite hacer peticiones HTTP. Es sencillo y adecuado para peticiones básicas.
Ejemplo de fetch:
1import React, { useState, useEffect } from 'react'; 2 3function App() { 4 const [data, setData] = useState(null); 5 6 useEffect(() => { 7 fetch('https://api.example.com/data') 8 .then((response) => response.json()) 9 .then((data) => setData(data)) 10 .catch((error) => console.error("Error al obtener datos:", error)); 11 }, []); 12 13 return <div>{data ? JSON.stringify(data) : "Cargando..."}</div>; 14} 15 16export default App;
En este ejemplo:
fetchobtiene los datos y los convierte a JSON.datase actualiza con los datos de la API y se muestra en pantalla.
axios es una biblioteca popular que simplifica el uso de peticiones HTTP y proporciona configuraciones adicionales. Necesitamos instalarlo antes de usarlo:
1npm install axios
Ejemplo de axios:
1import React, { useState, useEffect } from 'react'; 2import axios from 'axios'; 3 4function App() { 5 const [data, setData] = useState(null); 6 7 useEffect(() => { 8 axios.get('https://api.example.com/data') 9 .then((response) => setData(response.data)) 10 .catch((error) => console.error("Error al obtener datos:", error)); 11 }, []); 12 13 return <div>{data ? JSON.stringify(data) : "Cargando..."}</div>; 14} 15 16export default App;
axios permite manejar fácilmente las configuraciones de la petición, como encabezados o tiempo de espera, y convierte automáticamente la respuesta a JSON.
2. Estados de carga, éxito y error
Al consumir una API, nuestra aplicación debe mostrar al usuario:
- Estado de carga: mientras esperamos la respuesta.
- Estado de éxito: cuando obtenemos los datos.
- Estado de error: si ocurre un problema.
Ejemplo de manejo de estados de carga, éxito y error:
1import React, { useState, useEffect } from 'react'; 2import axios from 'axios'; 3 4function DatosAPI() { 5 const [data, setData] = useState(null); 6 const [loading, setLoading] = useState(true); 7 const [error, setError] = useState(null); 8 9 useEffect(() => { 10 axios.get('https://api.example.com/data') 11 .then((response) => { 12 setData(response.data); 13 setLoading(false); 14 }) 15 .catch((error) => { 16 setError("Error al cargar los datos"); 17 setLoading(false); 18 }); 19 }, []); 20 21 if (loading) return <p>Cargando...</p>; 22 if (error) return <p>{error}</p>; 23 24 return <div>{JSON.stringify(data)}</div>; 25} 26 27export default DatosAPI;
En este ejemplo:
loadingindica si los datos están en proceso de carga.errorguarda el mensaje de error si algo falla.datacontiene los datos en caso de éxito.
3. Ejercicio práctico: Aplicación de búsqueda de usuarios con API
Vamos a crear una aplicación en React que busque usuarios en la API de GitHub. La aplicación tendrá:
- Un campo de entrada para ingresar el nombre de usuario.
- Un botón para buscar.
- Muestra los resultados, junto con el estado de carga y errores.
Código completo de la aplicación de búsqueda de usuarios:
1import React, { useState } from 'react'; 2import axios from 'axios'; 3 4function BusquedaUsuarios() { 5 const [usuario, setUsuario] = useState(''); 6 const [datosUsuario, setDatosUsuario] = useState(null); 7 const [loading, setLoading] = useState(false); 8 const [error, setError] = useState(null); 9 10 const buscarUsuario = async () => { 11 setLoading(true); 12 setError(null); 13 setDatosUsuario(null); 14 15 try { 16 const response = await axios.get(`https://api.github.com/users/${usuario}`); 17 setDatosUsuario(response.data); 18 } catch (error) { 19 setError("Usuario no encontrado"); 20 } finally { 21 setLoading(false); 22 } 23 }; 24 25 return ( 26 <div style={{ textAlign: 'center' }}> 27 <h1>Búsqueda de Usuarios de GitHub</h1> 28 <input 29 type="text" 30 value={usuario} 31 onChange={(e) => setUsuario(e.target.value)} 32 placeholder="Nombre de usuario de GitHub" 33 /> 34 <button onClick={buscarUsuario}>Buscar</button> 35 36 {loading && <p>Cargando...</p>} 37 {error && <p style={{ color: 'red' }}>{error}</p>} 38 {datosUsuario && ( 39 <div style={{ marginTop: '20px' }}> 40 <img src={datosUsuario.avatar_url} alt={datosUsuario.login} width="100" /> 41 <h2>{datosUsuario.name}</h2> 42 <p>Seguidores: {datosUsuario.followers}</p> 43 <p>Siguiendo: {datosUsuario.following}</p> 44 <p>Repositorios: {datosUsuario.public_repos}</p> 45 <a href={datosUsuario.html_url} target="_blank" rel="noopener noreferrer"> 46 Perfil de GitHub 47 </a> 48 </div> 49 )} 50 </div> 51 ); 52} 53 54export default BusquedaUsuarios;
En este ejercicio:
-
Campos y estado:
usuario: guarda el nombre de usuario ingresado.datosUsuario: contiene los datos del usuario de GitHub.loadingyerrorpara manejar los estados de carga y errores.
-
Función
buscarUsuario:- Esta función se llama al hacer clic en "Buscar". Intenta obtener datos del usuario con
axios.get. - Si la búsqueda tiene éxito,
datosUsuariose actualiza con los datos obtenidos. - Si falla,
errormuestra "Usuario no encontrado".
- Esta función se llama al hacer clic en "Buscar". Intenta obtener datos del usuario con
-
Renderización condicional:
- Mientras se cargan los datos, muestra "Cargando...".
- Si hay un error, muestra un mensaje de error en rojo.
- Si la búsqueda es exitosa, muestra los datos del usuario: imagen, nombre, seguidores, seguidos y un enlace al perfil.
Este ejercicio muestra cómo integrar axios con React para crear una aplicación interactiva, optimizando la experiencia del usuario mediante el manejo de estados de carga, éxito y error.
- Loading...