Junior
Czym jest useContext w React?
sobes.tech AI
Odpowiedź od AI
useContext to hook w React, który pozwala komponentom funkcyjnym subskrybować zmiany w kontekście. Zapewnia sposób przekazywania danych przez drzewo komponentów bez konieczności jawnego przekazywania props na każdym poziomie.
Zasada działania:
- Tworzenie kontekstu: Używa się
React.createContext()do utworzenia obiektu kontekstu. Obiekt ten zawiera Provider i Consumer (lub używa sięuseContextw komponentach funkcyjnych). - Udostępnianie wartości: Komponent Provider kontekstu otacza drzewo komponentów, które potrzebują dostępu do wartości. Przez prop
valueprzekazuje się wartość, która będzie dostępna dla wszystkich subskrybowanych komponentów. - Odbieranie wartości:
useContext(MyContext)jest wywoływane wewnątrz komponentu funkcyjnego, gdzieMyContextto wcześniej utworzony kontekst. Hook zwraca aktualną wartość kontekstu. Gdy wartość kontekstu się zmienia, komponent korzystający zuseContextjest automatycznie ponownie renderowany.
Zalety:
- Łatwość przekazywania danych: Eliminuje konieczność "prop drilling" przez wiele komponentów pośrednich.
- Stan globalny: Przydatny do zarządzania globalnym stanem aplikacji (np. motyw, uwierzytelnianie, lokalizacja).
- Wydajność: React optymalizuje renderowanie komponentów korzystających z
useContext, odświeżając tylko te, które są subskrybowane na zmiany tego kontekstu.
Wady:
- Trudność w debugowaniu: Może być trudniej śledzić, skąd pochodzi wartość kontekstu w porównaniu do propsów.
- Wydajność przy częstych aktualizacjach: Jeśli wartość kontekstu jest aktualizowana bardzo często, może to prowadzić do częstych ponownych renderów wszystkich subskrybowanych komponentów.
Przykład:
import React, { createContext, useContext } from 'react';
// 1. Tworzenie kontekstu
const ThemeContext = createContext('light');
// Komponent dostawca
function ThemeProvider({ children }) {
const theme = 'dark'; // Przykładowa wartość
return <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>;
}
// Komponent korzystający z kontekstu
function ThemedComponent() {
// 3. Odbieranie wartości kontekstu
const theme = useContext(ThemeContext);
return <div style={{ background: theme === 'dark' ? '#333' : '#fff', color: theme === 'dark' ? '#fff' : '#000' }}>Motyw: {theme}</div>;
}
// Aplikacja
function App() {
return (
<ThemeProvider> {/* 2. Udostępnianie wartości */}
<ThemedComponent />
</ThemeProvider>
);
}
export default App;