Javascript
HTML and CSS
React.js
useReducer
useContext
🎥 Puedes ver un videotutorial completo sobre cómo crear tu aplicación React con Context.API y useReducer siguiendo esta plantilla.
useReducer
y useContext
en tu TemplateAsegúrate de seguir primero los pasos de ejecutar el proyecto, luego vuelve a esta lectura. Si estás usando Codespaces es posible que el proyecto ya esté en ejecución.
La app inicia en main.jsx
, donde se define el proveedor global. Las rutas están en el archivo routes.jsx
, que organiza la navegación de la aplicación a través de reac-router
, puedes leer más sobre React Router aquí.
Abre el archivo routes.jsx
, donde se definen las rutas como:
1import { createBrowserRouter, createRoutesFromElements, Route } from "react-router-dom"; 2import { Layout } from "./pages/Layout"; 3import { Home } from "./pages/Home"; 4import { Single } from "./pages/Single"; 5import { Demo } from "./pages/Demo"; 6 7export const router = createBrowserRouter( 8 createRoutesFromElements( 9 <Route path="/" element={<Layout />} errorElement={<h1>Not found!</h1>}> 10 <Route path="/" element={<Home />} /> 11 <Route path="/single/:theId" element={<Single />} /> 12 <Route path="/demo" element={<Demo />} /> 13 </Route> 14 ) 15);
Como verás ya hemos añadido algunas rutas como Home
, Demo
y Single
, estas vistas son ejemplos útiles de las cosas más frecuentes que sueles necesitar en un proyecto.
Como puedes ver, la página /pages/Demo.jsx
es un componente React que accede al estado global y despacha acciones:
1import useGlobalReducer from "../hooks/useGlobalReducer"; 2 3export const Demo = () => { 4 const { store, dispatch } = useGlobalReducer(); 5 6 return ( 7 <ul> 8 {store.todos.map(todo => ( 9 <li key={todo.id} style={{ background: todo.background }}> 10 {todo.title} 11 <button onClick={() => dispatch({ 12 type: 'add_task', 13 payload: { id: todo.id, color: '#ffa500' } 14 })}> 15 Cambiar color 16 </button> 17 </li> 18 ))} 19 </ul> 20 ); 21};
Algunos puntos claves que podrias observar de esta vista, son:
Demo.js
) se hace la importacion de useGlobalReducer
que se utilizará para tratar cualquier información global necesaria de otras vistas o de la aplicación.useGlobalReducer
se llama dentro del componente, en el primer par de líneas:1const { store, dispatch } = useGlobalReducer();
Guarda estilos en el archivo index.css
o crea archivos CSS por componente.
src/styles/demo.css
):1.orange-bg { 2 background-color: #ffa500; 3}
Importa en Demo.jsx
:
1import "../styles/demo.css";
Crea ./components/Card.jsx
:
1export const Card = ({ title, subtitle }) => ( 2 <div className="card"> 3 <h5>{title}</h5> 4 <h6>{subtitle}</h6> 5 </div> 6);
Úsalo en Home.jsx
:
1import { Card } from "../components/Card"; 2 3export const Home = () => ( 4 <Card title="Hello" subtitle="Welcome to Home" /> 5);
useGlobalReducer
)useGlobalReducer
obtiene store
y dispatch
desde el contexto global definido en src/hooks/useGlobalReducer.jsx
, conectándose con el sistema de manejo de estado de src/store.js
.
En tus componentes, importa y usa el hook useGlobalReducer
para acceder al estado (store
) y actualizarlo mediante dispatch
.
Demo.jsx
:1import useGlobalReducer from "../hooks/useGlobalReducer"; 2 3export const Demo = () => { 4 const { store, dispatch } = useGlobalReducer(); 5 6 const cambiarColor = (id) => { 7 dispatch({ 8 type: 'add_task', 9 payload: { id, color: '#ffa500' } 10 }); 11 }; 12 13 return ( 14 <ul> 15 {store.todos.map(todo => ( 16 <li key={todo.id} style={{ background: todo.background }}> 17 {todo.title} 18 <button onClick={() => cambiarColor(todo.id)}> 19 Cambiar color 20 </button> 21 </li> 22 ))} 23 </ul> 24 ); 25};
store.js
):El estado global se guarda y gestiona en src/store.js
mediante un reducer y un estado inicial definido en initialStore
.
initialStore
):1export const initialStore = () => { 2 return { 3 message: null, 4 todos: [ 5 { id: 1, title: "Make the bed", background: null }, 6 { id: 2, title: "Do my homework", background: null } 7 ] 8 }; 9};
El estado inicial contiene un mensaje y una lista de tareas (todos
), cada una con un id
, title
y background
.
storeReducer
):Cuando se ejecuta dispatch
, la acción es recibida por el reducer en src/store.js
, que actualiza el estado según el type
:
1case 'add_task': 2 return { 3 ...store, 4 todos: store.todos.map(todo => 5 todo.id === action.payload.id 6 ? { ...todo, background: action.payload.color } 7 : todo 8 ) 9 };
Con esta estructura (initialStore
y storeReducer
), tu aplicación mantiene un estado global centralizado y escalable.
Iniciar sesión (necesitas tener una cuenta):
1$ npm i vercel -g && vercel login
Desplegar:
1$ vercel --prod
✎ Nota: Si no tienes una cuenta, simplemente ve a vercel.com, crea una cuenta y regresa aquí.