Curso react nivel medio
En aplicaciones React, puede ser necesario que varios componentes compartan datos. Esto puede complicarse si tenemos que pasar props por múltiples niveles de componentes. Context API resuelve este problema permitiéndonos crear un contexto global al que varios componentes pueden acceder, sin importar en qué nivel del árbol estén.
1. Uso de Context API para compartir estado entre componentes
Con Context API:
- Creamos un contexto con
React.createContext(). - Proveemos el contexto a través de un componente
Provider, que envuelve los componentes que necesitan acceso a los datos. - Consumimos el contexto en los componentes hijos usando el Hook
useContext.
Ejemplo básico de Context API:
1import React, { createContext, useContext, useState } from 'react'; 2 3// Crear el contexto 4const UsuarioContext = createContext(); 5 6// Componente proveedor que envuelve a los componentes que necesitan el contexto 7function UsuarioProvider({ children }) { 8 const [usuario, setUsuario] = useState("Ana"); 9 10 return ( 11 <UsuarioContext.Provider value={{ usuario, setUsuario }}> 12 {children} 13 </UsuarioContext.Provider> 14 ); 15} 16 17// Componente que consume el contexto 18function MostrarUsuario() { 19 const { usuario } = useContext(UsuarioContext); 20 return <p>Usuario: {usuario}</p>; 21} 22 23// Componente principal 24function App() { 25 return ( 26 <UsuarioProvider> 27 <MostrarUsuario /> 28 </UsuarioProvider> 29 ); 30} 31 32export default App;
En este ejemplo:
UsuarioProvideres el proveedor del contexto y tiene el estadousuario.MostrarUsuarioes un componente que consume el contexto y muestra el valor deusuario.
2. Ejercicio práctico: Tema oscuro/claro con Context
Vamos a crear una aplicación con tema oscuro y claro usando Context API. Tendremos un botón para alternar entre los temas, y el color de fondo cambiará en función del tema seleccionado.
1import React, { createContext, useContext, useState } from 'react'; 2 3// Crear el contexto de Tema 4const TemaContext = createContext(); 5 6// Proveedor de Tema 7function TemaProvider({ children }) { 8 const [temaOscuro, setTemaOscuro] = useState(false); 9 10 const alternarTema = () => { 11 setTemaOscuro((prevTemaOscuro) => !prevTemaOscuro); 12 }; 13 14 return ( 15 <TemaContext.Provider value={{ temaOscuro, alternarTema }}> 16 {children} 17 </TemaContext.Provider> 18 ); 19} 20 21// Componente que consume el contexto de Tema 22function BotonTema() { 23 const { temaOscuro, alternarTema } = useContext(TemaContext); 24 25 return ( 26 <button onClick={alternarTema} style={{ 27 padding: '10px', 28 marginTop: '20px', 29 cursor: 'pointer' 30 }}> 31 Cambiar a {temaOscuro ? "Tema Claro" : "Tema Oscuro"} 32 </button> 33 ); 34} 35 36// Componente que muestra el tema actual 37function AplicacionConTema() { 38 const { temaOscuro } = useContext(TemaContext); 39 40 return ( 41 <div 42 style={{ 43 backgroundColor: temaOscuro ? '#333' : '#FFF', 44 color: temaOscuro ? '#FFF' : '#333', 45 minHeight: '100vh', 46 display: 'flex', 47 flexDirection: 'column', 48 alignItems: 'center', 49 justifyContent: 'center' 50 }} 51 > 52 <h1>{temaOscuro ? "Tema Oscuro" : "Tema Claro"}</h1> 53 <BotonTema /> 54 </div> 55 ); 56} 57 58// Componente principal 59function App() { 60 return ( 61 <TemaProvider> 62 <AplicacionConTema /> 63 </TemaProvider> 64 ); 65} 66 67export default App;
En este ejercicio:
- Creamos un contexto
TemaContextpara manejar el tema. TemaProvidermantiene el estadotemaOscuro, que indica si el tema es oscuro o claro, y la funciónalternarTemapara cambiar entre los temas.AplicacionConTemacambia el estilo de fondo y texto según el valor detemaOscuro.BotonTemausaalternarTemapara cambiar el tema al hacer clic.
Esta aplicación muestra cómo compartir el estado global del tema entre componentes y aplicar estilos dinámicos, proporcionando una experiencia de usuario personalizada.
- Loading...