React — Kurzreferenz
- React: JS‑Bibliothek für deklarative UIs, oft für SPAs; kombiniert mit Router + State‑Management (Context/Redux/Zustand).
Grundprinzip
- Komponentenbasiert: UI = kleine, wiederverwendbare Komponenten
- Kapselung: eigene Props, State, Nebenwirkungen
- Zusammensetzbar: Komponenten verschachteln für komplexe UIs
- Vorteil: bessere Testbarkeit & Wiederverwendung
JSX
- HTML‑ähnliche Syntax in JS; wird transpiled (z.B. Babel)
- JS‑Ausdrücke in
{}; Attribute:className,htmlFor - Kurzbeispiel:
const btn = <button className="primary">{label || "OK"}</button>;State & Props
- Props: unveränderliche Eingaben vom Elternteil (wie Funktionsargumente)
- State: lokaler, veränderbarer Zustand (z.B.
useState) - Kommunikation: Props down, Events/Callbacks up
- Kurzbeispiel:
function Counter({ start }) {
const [count, setCount] = useState(start);
return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}Lifecycle / Hooks
- Hooks ersetzen klassische Lifecycle‑Methoden in Funktionskomponenten
- Wichtige Hooks:
useState,useEffect,useContext,useReducer,useRef,useMemo,useCallback - useEffect (Abhängigkeiten + Cleanup) — Beispiel:
useEffect(() => {
const id = setInterval(tick, 1000);
return () => clearInterval(id); // Cleanup
}, [deps]); // [] = einmal, keine Angabe = bei jedem RenderVirtuelles DOM & Performance
- Virtual DOM: Diffing → minimale DOM‑Änderungen
- Performance‑Tipps:
- Verwende
keybei Listen (key= stabiler Identifier) - Memoize:
React.memo,useMemo,useCallbackbei teuren Berechnungen / Props - Vermeide unnötige Re‑Renders (stabiles Props/Callbacks)
Schnellreferenz Hooks (1‑Zeiler)
-
useState: lokaler State
-
useEffect: Nebenwirkungen & Cleanup
-
useContext: Zugriff auf Context
-
useReducer: komplexe State‑Logik (Redux‑ähnlich)
-
useRef: DOM/Mutable Ref ohne Re‑Render
-
useMemo: Werte memoizen (teure Berechnung)
-
useCallback: Funktionen memoizen (stabile Referenz) Hier kurze Code‑Beispiele für alle Hooks / Commands. Erklärungen nur in Kommentaren.
-
useState
import { useState } from 'react';
function Counter({ start = 0 }) {
const [count, setCount] = useState(start);
// count = aktueller Wert
// setCount(newVal) = State aktualisieren
return <button onClick={() => setCount(c => c + 1)}>{count}</button>;
}- useEffect
import { useEffect, useState } from 'react';
function Timer() {
const [sec, setSec] = useState(0);
useEffect(() => {
// Effekt: startet Interval beim Mount
const id = setInterval(() => setSec(s => s + 1), 1000);
return () => clearInterval(id); // Cleanup beim Unmount
}, []); // [] = nur einmal nach Mount
return <div>{sec}s</div>;
}- useContext
import { createContext, useContext } from 'react';
const ThemeContext = createContext('light');
function Toolbar() {
// konsumiert Context: erhält aktuellen Theme‑Wert
const theme = useContext(ThemeContext);
return <div className={theme}>Toolbar</div>;
}
// Verwendung:
// <ThemeContext.Provider value="dark"><Toolbar/></ThemeContext.Provider>- useReducer
import { useReducer } from 'react';
function reducer(state, action) {
switch (action.type) {
case 'inc': return { count: state.count + 1 };
case 'dec': return { count: state.count - 1 };
default: return state;
}
}
function CounterReducer() {
const [state, dispatch] = useReducer(reducer, { count: 0 });
// dispatch({type: 'inc'}) statt setState für komplexe Logik
return (
<>
<button onClick={() => dispatch({type: 'dec'})}>-</button>
<span>{state.count}</span>
<button onClick={() => dispatch({type: 'inc'})}>+</button>
</>
);
}- useRef
import { useRef, useEffect } from 'react';
function FocusInput() {
const inputRef = useRef(null);
// inputRef.current verweist auf DOM‑Element, ändert sich ohne Re‑Render
useEffect(() => {
inputRef.current?.focus(); // Fokus setzen beim Mount
}, []);
return <input ref={inputRef} />;
}- useMemo
import { useMemo, useState } from 'react';
function Expensive({ n }) {
const [toggle, setToggle] = useState(false);
const fib = useMemo(() => {
// teure Berechnung wird nur neu berechnet, wenn n sich ändert
function f(x){ return x < 2 ? x : f(x-1)+f(x-2); }
return f(n);
}, [n]);
return (
<>
<div>{fib}</div>
<button onClick={() => setToggle(t => !t)}>{String(toggle)}</button>
</>
);
}- useCallback
import { useState, useCallback } from 'react';
function Parent() {
const [count, setCount] = useState(0);
const increment = useCallback(() => {
// stabile Funktion‑Referenz, nützlich für optimierte Kinderkomponenten
setCount(c => c + 1);
}, []); // Abhängigkeiten: neu erstellen wenn leer => nie
return <Child onClick={increment} />;
}
function Child({ onClick }) {
// Child kann mit React.memo gerendert werden, wenn onClick stabil ist
return <button onClick={onClick}>Inc</button>;
}- React.memo (Komponentenmemo)
import React from 'react';
const Child = React.memo(function Child({ value }) {
// rendert nur neu, wenn props.value sich ändert (shallow)
return <div>{value}</div>;
});