Hvorfor en almindelig variabel ikke er nok
I niveau 2 byggede du en tæller ved selv at omskrive knappens tekst efter hvert klik. React gør det anderledes: du ændrer dataene, og React tegner skærmen om. Men du skal overgive dataene til en speciel boks kaldet state – ellers bemærker React ikke ændringen.
Vis mig: en tæller i React
import { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<button onClick={() => setCount(count + 1)}>
Clicked: {count}×
</button>
);
}
export default Counter;
Bryd den vigtigste linje ned – const [count, setCount] = useState(0);:
useState(0)– “React, sæt en boks op for mig med startværdi 0.”count– den aktuelle værdi i boksen (skrivebeskyttet).setCount– den eneste korrekte måde at ændre værdien på. Når du kaldersetCount(5), gemmer React den nye værdi og tegner overalt, hvorcountbruges, af sig selv.
Og onClick={...} er React-versionen af addEventListener("click", ...) – lige inde i JSX.
Læg mærke til, hvad der ikke er i koden: ingen getElementById, ingen textContent. Du siger ikke hvordan skærmen skal ændres – du siger hvad der er sandt nu (count er nu 5), og skærmen retter sig selv.
Vis mig: state styrer, hvad der er synligt
State behøver ikke bare at være et tal. En sammenklappelig sektion, React-måden:
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>
);
}
To nye JSX-tricks:
condition ? A : B– forkortet if/else lige inde i HTML: “hvis den er åben, vis dette, ellers det.”condition && (...)– “render kun dette, hvis betingelsen er sand.” Nåropener falsk, eksisterer listen simpelthen ikke.
Og !open betyder “det modsatte” – det vender sand til falsk og omvendt. Én linje = en kontakt.
Nu er det din tur 💪
Tilføj to ting med state til din app:
- En sammenklappelig sektion (en
true/false-state), der matcher dit projekt: 🏫 en sammenklappelig frokostmenu · 🙋 “vis/skjul mine topspil” · 🌍 en sammenklappelig liste over lande · ⚽ en sammenklappelig trup. - En tæller eller en afstemning (en numerisk state): 🏫 stem på klasseturen · 🙋 “hvor mange har hilset på mig i dag” · 🌍 besøgte lande-tæller · ⚽ en resultattavle med
+1 hjemme/+1 ude-knapper (to states!).
Bonusløsning: en resultattavle med to 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;
En komponent kan have så mange bokse, den vil – hver useState er én.
Tjek dig selv: Din app har mindst to interaktive steder, og der er ingen getElementById nogen steder i koden. Hvis du har mestret dette mentale skift (“jeg ændrer dataene, ikke skærmen”), har du mestret den sværeste del af React.
Det tager du med fra denne lektion
const [value, setValue] = useState(start)– en komponents hukommelse.- Ændr den kun gennem
setValue(...)– React tegner så om af sig selv. - I JSX:
onClick={...}, betingelser? :og&&styrer, hvad der er synligt.
© 2026 Ing. Martin Polak / AlgoRhino · Vilkår for indholdsbrug