Hoy · Hoja de ruta
- 1. Aprende: Qué es el estado de una interfaz y por qué debe estar en un solo sitio.
- 2. Haz: Reescribe tu página con el ciclo evento → estado → render.
- 3. Comprueba: Ninguna decisión se toma leyendo la página.
Antes de empezar · 5 minutos, sin apuntes
- Ahora mismo, ¿dónde está guardado qué filtro está activo?
- Si hubiera dos sitios donde consultarlo, ¿qué podría pasar?
- ¿Qué información necesitarías para volver a pintar la página exactamente igual?
El problema que resuelve
Sin estado, la información se reparte: el término de búsqueda está en el campo, la categoría en la clase de un botón, el orden en una variable y los resultados en el DOM. Cuatro sitios que hay que mantener de acuerdo a mano, y que tarde o temprano dejan de estarlo.
Estado
Un objeto que contiene todo lo que hace falta para saber cómo debe verse la interfaz en este momento. Si lo tienes, puedes pintar la página entera desde cero.
// js/estado.js
export const estado = {
productos: [],
busqueda: "",
categoria: "todas",
orden: "precio-asc",
soloDisponibles: false,
cargando: false,
error: null
};
El ciclo
// js/main.js
function actualizar() {
const visibles = aplicarFiltros(estado);
pintarCatalogo(visibles, elementos.catalogo);
pintarResumen(visibles.length, estado.productos.length, elementos.resumen);
sincronizarControles(estado, elementos);
}
elementos.buscador.addEventListener("input", (evento) => {
estado.busqueda = evento.target.value;
actualizar();
});
elementos.orden.addEventListener("change", (evento) => {
estado.orden = evento.target.value;
actualizar();
});
Cada manejador hace exactamente dos cosas: cambiar el estado y pedir que se actualice. Ninguno toca el DOM directamente.
- Evento
- Cambia el estado
- actualizar()
- La página refleja el estado
No preguntes a la página; pregunta al estado
La tentación es comprobar si un botón tiene una clase para saber si el filtro está activo. Eso convierte al DOM en un almacén de datos, y a partir de ahí hay dos verdades que pueden discrepar.
El DOM es salida, no memoria. Se escribe en él; no se lee de él.
Aplicar los filtros en un sitio
// js/catalogo.js — funciones de la UD3, combinadas
export function aplicarFiltros(estado) {
let resultado = estado.productos;
if (estado.busqueda.trim() !== "") resultado = buscar(resultado, estado.busqueda);
if (estado.categoria !== "todas") resultado = porCategoria(resultado, estado.categoria);
if (estado.soloDisponibles) resultado = disponibles(resultado);
return ordenar(resultado, estado.orden);
}
Una función pura: recibe el estado y devuelve la lista que toca. Se puede probar sin abrir el navegador, que es exactamente lo que la hace fácil de arreglar cuando algo falla.
Tarea 10 · Reescribir con estado
- Crea
js/estado.jscon el objeto y sus valores iniciales. - Escribe
aplicarFiltros(estado)combinando tus funciones de la UD3. - Escribe
actualizar()como único punto que pinta. - Convierte todos tus manejadores al patrón «cambia estado, actualiza».
- Elimina cualquier lectura del DOM que sirviera para decidir algo.
- Comprueba que cambiando el estado a mano desde la consola y llamando a
actualizar()la página responde.
sincronizarControles deje los campos coherentes con el estado.Checkpoint · fin de la sesión 10
- Existe un único objeto de estado.
- Los manejadores cambian estado y llaman a actualizar.
- Ninguna decisión se toma leyendo el DOM.
- Puedes reproducir cualquier vista fijando el estado a mano.
Antes de cerrar · 2 minutos, sin mirar
- ¿Qué es el estado de una interfaz?
- ¿Por qué el DOM no debe ser el almacén de datos?
- ¿Qué dos cosas hace un manejador de eventos?
Ver respuestas
1 · Todo lo necesario para saber cómo debe verse la página ahora mismo.
2 · Porque tendrías dos fuentes de verdad que pueden contradecirse.
3 · Cambiar el estado y pedir que se vuelva a pintar.