\section{Mellékhatások}

\begin{frame}{Mi az a mellékhatás (side effect)?}
  \begin{block}{Definí­ció}
    Mellékhatásnak nevezzük mindazt, ami a komponens \textbf{renderelésén kívül} történik: hálózati kérés, DOM-módosítás, timer beállítása, eseménykezelő regisztrálása.
  \end{block}
  \vspace{0.5em}
  \begin{itemize}
    \item A renderelési fázisban ilyen műveletek nem végzhetők --- a React elvárja, hogy a renderelés \textbf{tiszta} (mellékhatásmentes) legyen.
    \item A \texttt{useEffect} hook nyújtja a lehetőséget arra, hogy e műveleteket \emph{renderelés után} hajtsuk végreh.
  \end{itemize}
\end{frame}

\begin{frame}{\texttt{useEffect} --- mikor és hányszor fut le?}
  \begin{itemize}
    \item \textbf{Függőségi történk:} minden egyes renderelés után lefut --- általában nem ezt akarjuk.
    \item \textbf{Üres történk (\texttt{[]}):} csak az első megjelenítéskor fut le egyszer --- pl. induló adatlekéréshez.
    \item \textbf{Értékekkel (\texttt{[id, szuro]}):} amikor a felsorolt értékek bármelyike megváltozik, újra lefut.
  \end{itemize}
  \vspace{0.4em}
  A függőségi történk tehát azt szabályozza, \textbf{mikor} akarjuk az effektet ismét futtatni.
\end{frame}

\begin{frame}{Cleanup --- takarítás az effect után}
  \begin{block}{Miért kell cleanup?}
    Ha egy komponens eltűnik az oldalról (pl. navigáció közben), az esetlegesen elindított timerek, eseményfigyelők tovább futnak, memóriaszivárgást okozva. A cleanup függvény ezt akadályozza meg.
  \end{block}
  \vspace{0.5em}
  \begin{itemize}
    \item Az effect \textbf{visszaadhat egy cleanup függvényt}: ez fut le a komponens unmountjakor, illetve az effect következő lefutása előtt.
    \item Tipikus eset: \texttt{clearInterval}, \texttt{removeEventListener}, API kérés megszakítása (\texttt{AbortController}).
  \end{itemize}
\end{frame}

\begin{frame}{Leggyakoribb hibák \texttt{useEffect}-tel}
  \begin{alertblock}{Figyelem}
    \begin{itemize}
      \item \textbf{Hiányzó dependency:} ha egy változót használunk de nem szerepel a tömbben, a hook régi értékkel dolgozhat --- ez nehezen felderíthető hiba.
      \item \textbf{Végtelen ciklus:} ha az effect frissít egy állapotot, ami maga is dependency, kör forgás indul.
      \item \textbf{Túl sok logika egy effectben:} egy effect egy felelősséget kezeljen; ha kettőt kezelne, bontsuk szét.
    \end{itemize}
  \end{alertblock}
\end{frame}
