133 lines
5.0 KiB
TeX
133 lines
5.0 KiB
TeX
\section{Context}
|
|
|
|
\begin{frame}{A prop drilling probléma}
|
|
\begin{block}{Mi az a prop drilling?}
|
|
Ha egy adat a komponensfa tetején él, de csak mélyen lent lévő komponensnek kell, akkor az összes közbülső komponensen át kell „ütni" props-szal --- még akkor is, ha a köztes komponensek maguk nem használják. Ez nehézkessé és törékennyé teszi a kódot.
|
|
\end{block}
|
|
\vspace{0.5em}
|
|
A \textbf{Context API} ezt a problémát oldja meg: az adatot egy közös „kút"-ban tároljuk, amelyből bármely leszármazott komponens közvetlen props nélkül is ihat.
|
|
\end{frame}
|
|
|
|
\begin{frame}{Mire jó a Context API?}
|
|
\begin{itemize}
|
|
\item \textbf{Ritkán változó, globális adatok} átadásához ideális --- pl. téma (dark/light), aktív nyelv, bejelentkezett felhasználó adatai.
|
|
\item Két lépés: 1) \textbf{Provider} --- közzéteszi az értéket a fában; 2) \textbf{useContext} --- olvasásra foglalja le a komponensben.
|
|
\item Nem teljes értékű állapotkezelő: sűrűn változó adatokhoz ne használjuk, mert minden fogyasztó komponens újrarenderelődik.
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\begin{frame}{A Context és a Provider szerepe}
|
|
\begin{block}{Context}
|
|
A \texttt{createContext} egy konténer, amely az adatot tárolja. Maga nem csinál semmit --- csak definiálja, hogy melyik adat lesz megosztva.
|
|
\end{block}
|
|
\vspace{0.4em}
|
|
\begin{block}{Provider}
|
|
A \texttt{Provider} egy komponens, amely körülvesz más komponenseket, és az értéket \textbf{elérhetővé teszi} számukra. Minden komponens, amely a Provider-ben van, felhasználhatja az adatot.
|
|
\end{block}
|
|
\end{frame}
|
|
|
|
\begin{frame}[fragile]{Context és Provider --- alapvető kódpélda}
|
|
\begin{verbatim}
|
|
import { createContext, useContext } from "react";
|
|
|
|
// 1. Context létrehozása
|
|
const ThemeContext = createContext("light");
|
|
|
|
// 2. Provider komponens a legfelső szinten
|
|
function App() {
|
|
return (
|
|
<ThemeContext.Provider value="dark">
|
|
<Header />
|
|
<Content />
|
|
</ThemeContext.Provider>
|
|
);
|
|
}
|
|
\end{verbatim}
|
|
\end{frame}
|
|
|
|
\begin{frame}[fragile]{Context és Provider --- alapvető kódpélda folytatás}
|
|
\begin{verbatim}
|
|
// 3. Leszármazott komponensben: useContext
|
|
function Header() {
|
|
const theme = useContext(ThemeContext);
|
|
return <h1>Tema: {theme}</h1>;
|
|
}
|
|
\end{verbatim}
|
|
\end{frame}
|
|
|
|
\begin{frame}[fragile]{Állapottal rendelkező Context --- teljesebb példa}
|
|
\footnotesize\begin{verbatim}
|
|
// ThemeContext.js
|
|
const ThemeContext = createContext();
|
|
|
|
export function ThemeProvider({ children }) {
|
|
const [theme, setTheme] = useState("light");
|
|
|
|
return (
|
|
<ThemeContext.Provider value={{ theme, setTheme }}>
|
|
{children}
|
|
</ThemeContext.Provider>
|
|
);
|
|
}
|
|
|
|
export function useTheme() {
|
|
return useContext(ThemeContext);
|
|
}
|
|
\end{verbatim}
|
|
\end{frame}
|
|
|
|
\begin{frame}[fragile]{Felhasználás az alkalmazásban}
|
|
\begin{verbatim}
|
|
// App.js
|
|
import { ThemeProvider } from "./ThemeContext";
|
|
|
|
function App() {
|
|
return (
|
|
<ThemeProvider>
|
|
<Header />
|
|
<MainContent />
|
|
</ThemeProvider>
|
|
);
|
|
}
|
|
\end{verbatim}
|
|
\end{frame}
|
|
\begin{frame}[fragile]{Felhasználás az alkalmazásban folytatás}
|
|
\begin{verbatim}
|
|
// Header.js
|
|
function Header() {
|
|
const { theme, setTheme } = useTheme();
|
|
return (
|
|
<button onClick={() => setTheme(theme === "light" ? "dark" : "light")}>
|
|
Aktualis tema: {theme}
|
|
</button>
|
|
);
|
|
}
|
|
\end{verbatim}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Hogyan működik a gyakorlatban?}
|
|
\begin{itemize}
|
|
\item \texttt{createContext()} a kontextus objektumot hozza létre.
|
|
\item A \texttt{Provider} értéket ad át a \texttt{value} prop-on.
|
|
\item Mélyen lent elhelyezkedő komponensek a \texttt{useContext()} hookkal használják az adatot.
|
|
\item Custom hook (pl. \texttt{useTheme()}) felhasználóbarátabb API-t nyújt.
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Jó gyakorlatok és gyakori hibák}
|
|
\begin{itemize}
|
|
\item \textbf{Custom hook:} szokjunk meg a saját hook megírásának (pl. \texttt{useTheme}), ez takarítja a kódot és segíti az újrafelhasználást.
|
|
\item \textbf{Túl nagy Context:} ha túl sok adat van egy Context-ben, minden frissítés újrarendereli az összes fogyasztót --- inkább bontsuk fel több kisebb Context-re.
|
|
\item \textbf{nem Context-ben való adat:} gyorsan változó, nagy mennyiségű adat (pl. valós idejű pozíciók) nem Context-ben való --- inkább store (Redux, Zustand) vagy külön state.
|
|
\item \textbf{Default érték:} adjunk adjunk értelmes \texttt{createContext()} paraméterét --- dev módban segít descobrire a hiányzó Providert.
|
|
\end{itemize}
|
|
\end{frame}
|
|
|
|
\begin{frame}{Context vs. más megoldások}
|
|
\begin{itemize}
|
|
\item \textbf{Props:} egyszerű, néhány szintű adatátadásra. Érthető, explicit.
|
|
\item \textbf{Context:} ritkán változó, globális adatok. Szétszórt komponensek között.
|
|
\item \textbf{State Manager (Redux/Zustand):} komplett üzleti logika, komplex frissítések, szinkronizálás.
|
|
\item \textbf{Szerverállapot (TanStack Query):} API-ból érkező adatok, cache, szinkronizálás.
|
|
\end{itemize}
|
|
\end{frame} |