Junior
Co je useContext v Reactu?
sobes.tech AI
Odpověď od AI
useContext je hook v Reactu, který umožňuje funkčním komponentám přihlásit se ke změnám v kontextu. Poskytuje způsob, jak předávat data přes strom komponent bez nutnosti explicitně předávat props na každé úrovni.
Princip fungování:
- Vytvoření kontextu: Používá se
React.createContext()k vytvoření objektu kontextu. Tento objekt obsahuje Provider a Consumer (nebo se používáuseContextve funkčních komponentách). - Poskytnutí hodnoty: Provider kontextu obaluje strom komponent, které potřebují přístup k hodnotě. Hodnota je předána přes prop
valuea je dostupná všem přihlášeným komponentám. - Získání hodnoty:
useContext(MyContext)se volá uvnitř funkční komponenty, kdeMyContextje dříve vytvořený kontext. Hook vrací aktuální hodnotu kontextu. Pokud se hodnota kontextu změní, komponenta, která používáuseContext, se automaticky znovu vykreslí.
Výhody:
- Snadné předávání dat: Odstraňuje potřebu "prop drilling" přes více mezilehlých komponent.
- Globální stav: Užitečné pro správu globálního stavu aplikace (například téma, autentizace, lokalizace).
- Výkon: React optimalizuje znovu-renderování komponent, které používají
useContext, a re-renderuje pouze ty, které jsou přihlášeny ke změnám daného kontextu.
Nevýhody:
- Složitost ladění: Může být složitější sledovat, odkud pochází hodnota kontextu ve srovnání s props.
- Výkon při častých aktualizacích: Pokud se hodnota kontextu aktualizuje velmi často, může to vést k častým znovu-renderováním všech přihlášených komponent.
Příklad:
import React, { createContext, useContext } from 'react';
// 1. Vytvoření kontextu
const ThemeContext = createContext('light');
// Poskytovatel
function ThemeProvider({ children }) {
const theme = 'dark'; // Příkladová hodnota
return <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>;
}
// Komponenta využívající kontext
function ThemedComponent() {
// 3. Získání hodnoty z kontextu
const theme = useContext(ThemeContext);
return <div style={{ background: theme === 'dark' ? '#333' : '#fff', color: theme === 'dark' ? '#fff' : '#000' }}>Téma: {theme}</div>;
}
// Aplikace
function App() {
return (
<ThemeProvider> {/* 2. Poskytnutí hodnoty */}
<ThemedComponent />
</ThemeProvider>
);
}
export default App;