En esta sección, aprenderemos cómo gestionar el estado de nuestra aplicación React y cómo integrar APIs para obtener y enviar datos. Este es un paso crucial para construir aplicaciones completas y funcionales.
Objetivos
- Comprender cómo gestionar el estado global de la aplicación.
- Aprender a integrar APIs externas utilizando
fetch
yaxios
. - Implementar la gestión del estado y la integración de API en un proyecto React.
Contenido
Gestión del Estado Global
Context API
La Context API de React es una forma de pasar datos a través del árbol de componentes sin tener que pasar props manualmente en cada nivel.
Creando un Contexto
import React, { createContext, useState } from 'react'; // Crear el contexto export const AppContext = createContext(); const AppProvider = ({ children }) => { const [state, setState] = useState({ user: null, theme: 'light', }); return ( <AppContext.Provider value={{ state, setState }}> {children} </AppContext.Provider> ); }; export default AppProvider;
Usando el Contexto en Componentes
import React, { useContext } from 'react'; import { AppContext } from './AppProvider'; const UserProfile = () => { const { state, setState } = useContext(AppContext); const updateUser = () => { setState({ ...state, user: { name: 'John Doe' } }); }; return ( <div> <h1>User Profile</h1> <p>Name: {state.user ? state.user.name : 'Guest'}</p> <button onClick={updateUser}>Update User</button> </div> ); }; export default UserProfile;
Redux
Redux es una biblioteca para la gestión del estado de aplicaciones JavaScript. Es especialmente útil para aplicaciones grandes donde la gestión del estado puede volverse compleja.
Configuración de Redux
// store.js import { createStore } from 'redux'; import rootReducer from './reducers'; const store = createStore(rootReducer); export default store;
Creando Reducers y Actions
// actions.js export const setUser = (user) => ({ type: 'SET_USER', payload: user, }); // reducers.js const initialState = { user: null, }; const rootReducer = (state = initialState, action) => { switch (action.type) { case 'SET_USER': return { ...state, user: action.payload }; default: return state; } }; export default rootReducer;
Conectando Redux a React
// App.js import React from 'react'; import { Provider } from 'react-redux'; import store from './store'; import UserProfile from './UserProfile'; const App = () => ( <Provider store={store}> <UserProfile /> </Provider> ); export default App;
Integración de API con Fetch
Realizando una Petición GET
import React, { useEffect, useState } from 'react'; const FetchData = () => { const [data, setData] = useState(null); useEffect(() => { fetch('https://api.example.com/data') .then(response => response.json()) .then(data => setData(data)) .catch(error => console.error('Error fetching data:', error)); }, []); return ( <div> <h1>Data from API</h1> {data ? <pre>{JSON.stringify(data, null, 2)}</pre> : <p>Loading...</p>} </div> ); }; export default FetchData;
Realizando una Petición POST
const postData = async (url = '', data = {}) => { const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(data), }); return response.json(); }; postData('https://api.example.com/data', { answer: 42 }) .then(data => console.log(data)) .catch(error => console.error('Error posting data:', error));
Integración de API con Axios
Instalación de Axios
Primero, instala Axios usando npm o yarn:
Realizando una Petición GET con Axios
import React, { useEffect, useState } from 'react'; import axios from 'axios'; const FetchDataWithAxios = () => { const [data, setData] = useState(null); useEffect(() => { axios.get('https://api.example.com/data') .then(response => setData(response.data)) .catch(error => console.error('Error fetching data:', error)); }, []); return ( <div> <h1>Data from API</h1> {data ? <pre>{JSON.stringify(data, null, 2)}</pre> : <p>Loading...</p>} </div> ); }; export default FetchDataWithAxios;
Realizando una Petición POST con Axios
axios.post('https://api.example.com/data', { answer: 42 }) .then(response => console.log(response.data)) .catch(error => console.error('Error posting data:', error));
Ejercicio Práctico
Objetivo
Crear una aplicación React que gestione el estado global utilizando Context API y realice peticiones a una API externa para obtener y mostrar datos.
Instrucciones
- Configura el Contexto: Crea un contexto para gestionar el estado global de la aplicación.
- Crea un Componente de Datos: Crea un componente que realice una petición GET a una API externa y muestre los datos.
- Integra el Contexto y el Componente de Datos: Usa el contexto para gestionar el estado de los datos obtenidos de la API y muéstralos en el componente.
Solución
// AppProvider.js import React, { createContext, useState } from 'react'; export const AppContext = createContext(); const AppProvider = ({ children }) => { const [data, setData] = useState(null); return ( <AppContext.Provider value={{ data, setData }}> {children} </AppContext.Provider> ); }; export default AppProvider; // FetchData.js import React, { useContext, useEffect } from 'react'; import axios from 'axios'; import { AppContext } from './AppProvider'; const FetchData = () => { const { data, setData } = useContext(AppContext); useEffect(() => { axios.get('https://api.example.com/data') .then(response => setData(response.data)) .catch(error => console.error('Error fetching data:', error)); }, [setData]); return ( <div> <h1>Data from API</h1> {data ? <pre>{JSON.stringify(data, null, 2)}</pre> : <p>Loading...</p>} </div> ); }; export default FetchData; // App.js import React from 'react'; import AppProvider from './AppProvider'; import FetchData from './FetchData'; const App = () => ( <AppProvider> <FetchData /> </AppProvider> ); export default App;
Conclusión
En esta sección, hemos aprendido cómo gestionar el estado global de una aplicación React utilizando Context API y Redux. También hemos visto cómo integrar APIs externas utilizando fetch
y axios
. Estos conceptos son fundamentales para construir aplicaciones React robustas y escalables. En el próximo módulo, nos enfocaremos en la optimización del rendimiento de nuestras aplicaciones React.
Curso de React
Módulo 1: Introducción a React
- ¿Qué es React?
- Configuración del Entorno de Desarrollo
- Hola Mundo en React
- JSX: Extensión de Sintaxis de JavaScript
Módulo 2: Componentes de React
- Entendiendo los Componentes
- Componentes Funcionales vs de Clase
- Props: Pasando Datos a Componentes
- State: Gestión del Estado del Componente
Módulo 3: Trabajando con Eventos
- Manejo de Eventos en React
- Renderizado Condicional
- Listas y Claves
- Formularios y Componentes Controlados
Módulo 4: Conceptos Avanzados de Componentes
- Elevando el Estado
- Composición vs Herencia
- Métodos del Ciclo de Vida de React
- Hooks: Introducción y Uso Básico
Módulo 5: Hooks de React
Módulo 6: Enrutamiento en React
Módulo 7: Gestión del Estado
- Introducción a la Gestión del Estado
- API de Contexto
- Redux: Introducción y Configuración
- Redux: Acciones y Reductores
- Redux: Conectando a React
Módulo 8: Optimización del Rendimiento
- Técnicas de Optimización del Rendimiento en React
- Memorización con React.memo
- Hooks useMemo y useCallback
- División de Código y Carga Perezosa
Módulo 9: Pruebas en React
- Introducción a las Pruebas
- Pruebas Unitarias con Jest
- Pruebas de Componentes con React Testing Library
- Pruebas de Extremo a Extremo con Cypress
Módulo 10: Temas Avanzados
- Renderizado del Lado del Servidor (SSR) con Next.js
- Generación de Sitios Estáticos (SSG) con Next.js
- TypeScript con React
- React Native: Creación de Aplicaciones Móviles