CodeForge

JavaScript de Cero a Experto / APIs del navegador

Reto: Mi Bolsillo que no olvida

Reto45 min100 XP

La promesa más vieja del curso se cobra hoy: la app interactiva del módulo 8 pierde su amnesia. Gastos que sobreviven a la recarga, con la arquitectura correcta — el array como única fuente de verdad, el DOM como espejo, y localStorage como memoria. Cuando termines, tendrás una app completa Y persistente, construida por ti desde el primer píxel.

Reto

Mi Bolsillo que no olvida

Difícil40 min100 XP(×2 sin mirar la solución)

Qué debes construir

La app del módulo 8 (formulario con validación, borrar por delegación, total reactivo)… que ahora RECUERDA. Esta vista previa muestra la app funcionando (sin persistencia — el sandbox de la vista previa no permite localStorage; en TU playground, agrega gastos y usa el botón de refresh del preview para verlos sobrevivir):

Requisitos:

  1. El par sagrado: cargar() (lee la llave "bolsillo:gastos", hace JSON.parse, y si el cajón está vacío devuelve la SEMILLA de 3 gastos: Almuerzo 18000, Bus 5800, Café 4500) y guardar(gastos) (JSON.stringify + setItem).
  2. La fuente de verdad es EL ARRAY — cambio de arquitectura respecto al módulo 8: el estado vive en gastos, y el DOM es un ESPEJO que se repinta desde él. Nada de leer dataset para calcular totales.
  3. UNA función aplicar(nuevosGastos) concentra todo cambio de estado: reasigna el array, guardar, repinta la lista completa (textContent = "" + map(crearItem) + un solo append), y recalcula el total con reduce + Intl.
  4. Agregar: submit + preventDefault + validación (nombre con trim no vacío, valor > 0, mensaje en #error) → aplicar con spread INMUTABLE ([...gastos, nuevo]), reset() y focus().
  5. Borrar por delegación (un listener en la ul, closest, chequeo de null): cada li guarda su índice en dataset.indice, y borrar es aplicar(gastos.filter(...)) — inmutable, módulo 12.
  6. Botón "Vaciar bolsillo": aplicar([]).
  7. La PRUEBA: agrega dos gastos, borra uno, recarga el preview (botón refresh del playground) — la lista debe volver EXACTA. Vacía, recarga: vacía se queda (ojo: vacío guardado NO es lo mismo que primera vez — tu cargar debe sembrar solo cuando la llave no existe).

Reglas

  • Cero innerHTML; cero mutaciones del array (push/splice prohibidos: spread y filter).
  • TODO cambio de estado pasa por aplicar — si hay un guardar o un repintado suelto por fuera, está mal.
  • El formateador Intl se crea una vez. Patrón iniciar para el DOM.

40:00

Cuando estés listo, arranca el reloj.

Qué sigue

Catorce módulos: lenguaje, DOM, asincronía, patrones y las APIs del navegador. Tu código ya HACE de todo — el módulo 15 te enseña qué pasa cuando lo que hace está MAL: manejo de errores en serio (tus propias clases de Error), y el arte más subestimado del oficio: DEPURAR con DevTools — breakpoints, watch, y la consola más allá del .log.