← Taso 3 – Mestari

Oppitunti 5/10 ⏱ 40 minuuttia Premium

Tila: sovellus joka muistaa

Opi useState – komponentin muisti. Sovelluksesi alkaa reagoida klikkauksiin React-tavalla.

Miksi tavallinen muuttuja ei riitä

Tasolla 2 rakensit laskurin kirjoittamalla painikkeen tekstin uudelleen jokaisen klikkauksen jälkeen. React tekee sen eri tavalla: muutat dataa, ja React piirtää näytön uudelleen. Mutta sinun pitää antaa data erityiseen laatikkoon nimeltä tila – muuten React ei huomaa muutosta.

Näytän sinulle: laskuri Reactissa

import { useState } from 'react';

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

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

export default Counter;

Puretaan tärkein rivi – const [count, setCount] = useState(0);:

Ja onClick={...} on React-versio addEventListener("click", ...):sta – suoraan JSX:ssä.

Huomaa mitä koodissa ei ole: ei getElementById:ä, ei textContent:ia. Et sano miten näyttöä muutetaan – sanot mikä on nyt totta (count on nyt 5), ja näyttö järjestäytyy itsestään.

Näytän sinulle: tila ohjaa mitä näkyy

Tilan ei tarvitse olla vain numero. Taittuva osio, React-tavalla:

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>
  );
}

Kaksi uutta JSX-temppua:

Ja !open tarkoittaa “päinvastainen” – se muuttaa true:n false:ksi ja päinvastoin. Yksi rivi = kytkin.

Nyt sinun vuorosi 💪

Lisää sovellukseesi kaksi asiaa tilalla:

  1. Taittuva osio (true/false-tila) joka sopii projektiisi: 🏫 taittuva ruokalista · 🙋 “näytä/piilota suosikkipelini” · 🌍 taittuva maiden lista · ⚽ taittuva pelaajalista.
  2. Laskuri tai äänestys (numeerinen tila): 🏫 äänestys luokkaretkestä · 🙋 “montako ihmistä tervehti minua tänään” · 🌍 käytyjen maiden laskuri · ⚽ tulostaulu +1 koti / +1 vieras -painikkeilla (kaksi tilaa!).
Bonus-ratkaisu: tulostaulu kahdella tilalla
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;

Komponentilla voi olla niin monta laatikkoa kuin haluaa – jokainen useState on yksi.

Tarkista itse: Sovelluksessasi on vähintään kaksi interaktiivista kohtaa, eikä koodissa ole getElementById:ä missään. Jos olet hallinnut tämän ajatusmuutoksen (“muutan dataa, en näyttöä”), olet hallinnut Reactin vaikeimman osan.

Mitä opit tästä oppitunnista