← Nivel 3 – Maestro

Lección 5 de 10 ⏱ 40 minutos Premium

State: una app que recuerda

Aprende useState – la memoria de un componente. Tu app empieza a reaccionar a los clics al estilo React.

Por qué una variable normal no basta

En el Nivel 2, construiste un contador reescribiendo tú el texto del botón tras cada clic. React lo hace distinto: cambias los datos, y React redibuja la pantalla. Pero tienes que entregar los datos en una caja especial llamada state – si no, React no notará el cambio.

Te lo muestro: un contador en React

import { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

  return (
    <button onClick={() => setCount(count + 1)}>
      Clicked: {count}×
    </button>
  );
}

export default Counter;

Desglosando la línea más importante – const [count, setCount] = useState(0);:

Y onClick={...} es la versión React de addEventListener("click", ...) – directamente dentro del JSX.

Fíjate en lo que no hay en el código: ni getElementById, ni textContent. No dices cómo cambiar la pantalla – dices qué es verdad ahora (count es ahora 5), y la pantalla se alinea sola.

Te lo muestro: el state controla qué se ve

El state no tiene que ser solo un número. Una sección plegable, al estilo React:

import { useState } from 'react';

function Menu() {
  const [open, setOpen] = useState(false);

  return (
    <div>
      <button onClick={() => setOpen(!open)}>
        {open ? "Hide the menu ▲" : "Show the menu ▼"}
      </button>

      {open && (
        <ul>
          <li>Monday: tomato soup with pasta</li>
          <li>Tuesday: chicken with rice</li>
          <li>Wednesday: pancakes with jam</li>
        </ul>
      )}
    </div>
  );
}

Dos trucos nuevos de JSX:

Y !open significa “lo contrario” – convierte true en false y al revés. Una línea = un interruptor.

Ahora tú 💪

Añade dos cosas con state a tu app:

  1. Una sección plegable (un state true/false) acorde a tu proyecto: 🏫 un menú del comedor plegable · 🙋 “mostrar/ocultar mis mejores juegos” · 🌍 una lista de países plegable · ⚽ una plantilla plegable.
  2. Un contador o una votación (state numérico): 🏫 votar el viaje de clase · 🙋 “cuánta gente me saludó hoy” · 🌍 contador de países visitados · ⚽ un marcador con botones +1 home / +1 away (¡dos states!).
Solución extra: un marcador con dos states
import { useState } from 'react';

function Score() {
  const [home, setHome] = useState(0);
  const [away, setAway] = useState(0);

  return (
    <div className="card">
      <h3>Riverside {home} : {away} Lakeside</h3>
      <button onClick={() => setHome(home + 1)}>Home goal ⚽</button>
      <button onClick={() => setAway(away + 1)}>Away goal 😤</button>
      <button onClick={() => { setHome(0); setAway(0); }}>New match</button>
    </div>
  );
}

export default Score;

Un componente puede tener tantas cajas como quiera – cada useState es una.

Compruébalo tú: Tu app tiene al menos dos puntos interactivos, y no hay getElementById en ningún sitio del código. Si has dominado este cambio mental (“cambio los datos, no la pantalla”), has dominado la parte más difícil de React.

Lo que te llevas de esta lección