Przejdź do głównej zawartości

04. Context API

Context API

Context API to mechanizm React do współdzielenia danych między komponentami bez przekazywania props przez każdy poziom drzewa (prop drilling). Klasyczne zastosowania: motyw (dark/light), język, dane zalogowanego użytkownika.

  1. Co to jest prop drilling? — Problem przekazywania props przez komponenty, które ich nie potrzebują
  2. Jak działa Context? — Provider owija drzewo, Consumer lub useContext odczytuje wartość
  3. Kiedy używać Context? — Dane globalne: auth, theme, locale; NIE do wszystkiego
  4. Wady Context? — Każda zmiana wartości re-renderuje wszystkich konsumentów
  1. Problem prop drilling — przykład 3-poziomowego przekazywania props
  2. createContext + Provider — tworzenie kontekstu, owijanie drzewa
  3. useContext hook — odczytywanie wartości w komponencie
  4. Wzorzec ThemeContext — przełączanie dark/light mode
  5. Kiedy NIE używać — wydajność, alternatywy (Zustand, Redux)

Schemat

Drzewo komponentów: lewe drzewo z “czerwonymi strzałkami” prop drilling przez 4 poziomy. Prawe drzewo z Context Provider owijającym wszystko i jedną strzałką do konsumenta.

Przykład kodu JSX

ThemeContext — przełącznik dark/light mode dostępny w każdym komponencie bez props.

  • Definicja prop drilling z wizualnym przykładem
  • createContext, Provider, useContext
  • Prosty przykład: ThemeContext dark/light

Forma: 10 slajdów, 10 minut

Ocena: 3.0
import { createContext, useContext, useState } from 'react';
// 1. Utwórz kontekst
const ThemeContext = createContext('light');
// 2. Provider owija aplikację
function App() {
const [theme, setTheme] = useState('light');
return (
<ThemeContext.Provider value={{ theme, setTheme }}>
<Header />
<Main />
</ThemeContext.Provider>
);
}
// 3. Dowolny komponent w drzewie może odczytać
function ThemeToggle() {
const { theme, setTheme } = useContext(ThemeContext);
return (
<button onClick={() => setTheme(t => t === 'light' ? 'dark' : 'light')}>
Motyw: {theme}
</button>
);
}
// ŹLE: theme wędruje przez każdy poziom
function App() {
const [theme] = useState('dark');
return <Header theme={theme} />;
}
function Header({ theme }) {
return <Nav theme={theme} />; // Header nie używa theme, tylko przekazuje dalej!
}
function Nav({ theme }) {
return <Button theme={theme} />; // Nav też nie używa!
}
function Button({ theme }) {
return <button className={theme}>Klik</button>; // Dopiero tu jest potrzebne
}

Wizualizacja prop drilling

Narysujcie drzewo z “kanałem telefonicznym” przez każdy poziom — słuchawka tylko na początku i końcu, ale kabel przez każde piętro. Context to “WiFi” — sygnał wszędzie bez kabli.

Ostrzeżenie o wydajności

Podkreślcie: Context to NIE Redux. Każda zmiana wartości Providera = re-render wszystkich konsumentów. Nie wrzucajcie wszystkiego do jednego kontekstu!

Context = globalny stan bez bólu!

Context API to jedno z najczęściej używanych narzędzi w projektach React. Po tej prezentacji klasa będzie wiedzieć jak uniknąć prop drillingu we własnym projekcie!