Vamos a adentrarnos en cómo React puede interactuar con el mundo exterior a través de solicitudes HTTP, un concepto crucial para prácticamente cualquier aplicación web moderna. Piensa en tu aplicación React como un restaurante y los datos que necesita como los ingredientes que se deben pedir y recibir desde diferentes proveedores (APIs o back-ends). Para hacer estos pedidos, podemos usar dos herramientas populares: Fetch API y Axios. Ambas son como los mensajeros que van y vienen trayendo lo que necesitas para cocinar tus platillos (mostrar datos en la aplicación).
Fetch API es parte del navegador y permite realizar solicitudes HTTP de manera sencilla y eficiente. No necesitas instalar nada extra para usar Fetch si estás trabajando en un ambiente que soporte estándares modernos de navegador.
Imagina que quieres obtener una lista de usuarios de una API. Aquí te muestro cómo podrías hacerlo:
import React, { useEffect, useState } from 'react';
function Users() {
const [users, setUsers] = useState([]);
useEffect(() => {
fetch('https://api.example.com/users')
.then(response => response.json())
.then(data => setUsers(data))
.catch(error => console.error('Error fetching users:', error));
}, []); // El array vacío asegura que la solicitud se haga una sola vez al montar el componente
return (
Lista de Usuarios
{users.map(user => (
{user.name}
))}
);
}
export default Users;
Axios es una biblioteca de JavaScript que puedes instalar y que facilita la realización de solicitudes HTTP. Ofrece algunas características adicionales sobre Fetch, como la capacidad de cancelar solicitudes y una mejor experiencia de manejo de errores.
npm install axios
Usando el mismo ejemplo de la lista de usuarios, veamos cómo se haría con Axios:
import React, { useEffect, useState } from 'react';
import axios from 'axios';
function Users() {
const [users, setUsers] = useState([]);
useEffect(() => {
axios.get('https://api.example.com/users')
.then(response => setUsers(response.data))
.catch(error => console.error('Error fetching users:', error));
}, []);
return (
Lista de Usuarios
{users.map(user => (
{user.name}
))}
);
}
export default Users;
useEffect
es un Hook que permite ejecutar efectos secundarios en componentes funcionales. Los efectos secundarios son operaciones que pueden afectar otros componentes y no solo el que se está renderizando, como peticiones de datos, suscripciones, o manualmente cambiar el DOM de tu aplicación.
useEffect
se utiliza comúnmente para realizar peticiones a APIs externas porque permite manejar operaciones que deberían ocurrir después de que el componente se haya montado y cada vez que se actualice, dependiendo de cómo configures sus dependencias.
Supongamos que quieres obtener datos de una API de usuarios y mostrarlos. Aquí te muestro cómo podrías estructurar eso con useEffect
:
import React, { useState, useEffect } from 'react';
function UserList() {
const [users, setUsers] = useState([]); // Estado inicial vacío para los usuarios
useEffect(() => {
// Función para cargar los datos de los usuarios
const fetchData = async () => {
try {
const response = await fetch('https://api.example.com/users');
const data = await response.json();
setUsers(data); // Guarda los datos de los usuarios en el estado
} catch (error) {
console.error('Error fetching data:', error);
}
};
fetchData(); // Llamada a la función de carga de datos
}, []); // El array vacío asegura que la operación se realice una sola vez al montar el componente
return (
Lista de Usuarios
{users.map(user => (
{user.name}
// Renderiza la lista de usuarios
))}
);
}
export default UserList;
useEffect
se ejecuta después de que el renderizado se completa, por lo que no bloqueará la visualización de la UI mientras la API se está llamando.useEffect
es un array de dependencias. Si dejas este array vacío, el efecto se ejecutará una sola vez después del primer renderizado, similar a componentDidMount
en componentes de clase. Si agregas variables al array, el efecto se ejecutará cada vez que estas variables cambien.async
y await
dentro de una función declarada dentro de useEffect
para manejar estas operaciones de manera elegante.