~/VibeHandbook
PDF gratis

Capítulo 11 · 03

Un ejemplo resuelto: una función de "Favoritos"

Construyamos una pequeña función de principio a fin: los usuarios pueden marcar elementos de una lista como favoritos y ver un contador de cuántos han marcado.

Dividiéndola en rebanadas

Así es como yo la dividiría en pasos verticales:

  1. Agregar un botón de estrella junto a cada elemento (todavía no hace nada, solo aparece).
  2. Al hacer clic en la estrella, alterna su apariencia encendida/apagada (solo estado, no se guarda).
  3. Mostrar un contador "★ 3 favoritos" que refleje los cambios.
  4. Guardar los favoritos para que persistan después de recargar la página.

Fíjate que cada paso es ejecutable y visible de forma independiente. Podrías detenerte después de cualquiera de ellos y aun así tener una aplicación funcional.

Paso 1: el botón

Un buen nombra el archivo, el cambio y qué no tocar:

In the ItemCard component (src/components/ItemCard.jsx), add a star
button in the top-right corner of each card. It should render an
outline star icon. Don't wire up any click behavior yet — just make
it appear. Keep the rest of the card layout unchanged.

Ejecuta la aplicación. ¿Ves las estrellas? Bien. Confirma el cambio:

git add -A && git commit -m "Add star button to item cards"

Paso 2: alternar el estado

Make the star button toggle between filled and outline when clicked.
Track this with local component state — don't save it anywhere yet.
A filled star means favorited.

Piensa en el estado como la memoria de corto plazo de la aplicación: lo que es verdad en este momento, como si una estrella en particular está actualmente rellena. Ahora estás manejando estado e interfaz juntos, lo cual es normal. (La interfaz de usuario, o UI, es simplemente la parte de la aplicación que una persona ve y con la que hace clic.) Es probable que la IA agregue algo como esto:

const [isFavorite, setIsFavorite] = useState(false);

<button onClick={() => setIsFavorite(!isFavorite)}>
  {isFavorite ? <StarFilled /> : <StarOutline />}
</button>

Haz clic en algunas estrellas. ¿Se alternan? Confirma el cambio.

Paso 3: el contador

Add a "★ N favorites" counter at the top of the item list. It should
count how many items currently have their star filled. Lift the
favorite state up to the list component if you need to so the counter
can see it.

Este paso puede requerir que la IA reestructure dónde vive el estado; eso es esperable, y es precisamente por eso que lo haces como un paso pequeño e independiente. Ejecútalo, marca algunas estrellas, observa cómo cambia el número. Confirma el cambio.

Paso 4: hacer que persista

Persist favorites so they survive a page reload. Use localStorage for
now — save the list of favorited item IDs whenever it changes, and
load it on startup.

(localStorage es solo un pequeño cuaderno de notas que el navegador guarda en la computadora del propio visitante, para que la aplicación pueda anotar cosas y volver a encontrarlas después de una recarga.) Recarga la página. ¿Sigue marcado como favorito? Acabas de lanzar una función, una rebanada ejecutable a la vez.

Así es como se comunican entre sí las piezas de la función terminada. Un clic fluye hacia el estado, la pantalla se vuelve a dibujar a partir del estado, y el estado se refleja en el almacenamiento para que sobreviva a una recarga:

     ┌─────────────────────────────────────────────┐
     │                                              │
   click star                                  redraws from
     │ (event)                                 state
     ▼                                              ▲
 ┌────────┐   updates    ┌─────────┐    feeds   ┌────────┐
 │   UI   │─────────────▶│  STATE  │───────────▶│   UI   │
 │(button)│              │(in app  │            │(filled │
 └────────┘              │ memory) │            │ star + │
                         └────┬────┘            │counter)│
                              │ save on change  └────────┘
                              ▼
                         ┌──────────┐
                         │ STORAGE  │  ◀── load on startup,
                         │(localSt.)│      so it survives reload
                         └──────────┘

¿Lo quieres sin conexión?

Descarga el libro entero en PDF o EPUB — gratis.