← Poziom 3 – Mistrz

Lekcja 5 z 10 ⏱ 40 minut Premium

State: aplikacja, która pamięta

Nauczysz się useState – pamięci komponentu. Twoja aplikacja zacznie reagować na kliknięcia po reactowemu.

Dlaczego zwykła zmienna nie wystarczy

Na poziomie 2 zbudowałeś licznik, sam przepisując tekst przycisku po każdym kliknięciu. React robi to inaczej: zmieniasz dane, a React przerysowuje ekran. Ale dane musisz oddać do specjalnego pudełka zwanego state – inaczej React zmiany nie zauważy.

Pokażę ci: licznik w Reactcie

import { useState } from 'react';

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

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

export default Counter;

Rozbijmy najważniejszą linię – const [count, setCount] = useState(0);:

A onClick={...} to reactowa wersja addEventListener("click", ...) – od razu w JSX.

Zauważ, czego w kodzie nie ma: żadnego getElementById, żadnego textContent. Nie mówisz jak zmienić ekran – mówisz co jest teraz prawdą (count ma teraz 5), a ekran sam się dopasowuje.

Pokażę ci: state steruje tym, co widać

State nie musi być tylko liczbą. Zwijana sekcja po reactowemu:

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

Dwa nowe triki JSX:

A !open znaczy „przeciwieństwo” – zamienia true na false i odwrotnie. Jedna linia = przełącznik.

Teraz ty 💪

Dodaj do aplikacji dwie rzeczy ze state:

  1. Zwijaną sekcję (state true/false) pasującą do projektu: 🏫 zwijane menu stołówki · 🙋 „pokaż/ukryj moje ulubione gry” · 🌍 zwijana lista krajów · ⚽ zwijana lista zawodników.
  2. Licznik albo głosowanie (state liczbowy): 🏫 głosowanie na wycieczkę klasową · 🙋 „ilu ludzi mnie dziś przywitało” · 🌍 licznik odwiedzonych krajów · ⚽ tablica wyników z przyciskami +1 home / +1 away (dwa stany!).
Bonusowe rozwiązanie: tablica wyników z dwoma stanami
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;

Komponent może mieć tyle pudełek, ile chce – każde useState to jedno.

Sprawdź się: Twoja aplikacja ma co najmniej dwa interaktywne miejsca i nigdzie w kodzie nie ma getElementById. Jeśli opanowałeś tę zmianę myślenia („zmieniam dane, nie ekran”), opanowałeś najtrudniejszą część Reacta.

Co wyniesiesz z tej lekcji