\section{Állapotkezelés} \begin{frame}{Mi az állapot (state)?} \begin{block}{Analógia: a komponens "emlékezete"} Az állapot az, amit a komponens \textbf{megjegyez} renderelések között. Gondoljunk rá úgy, mint egy cetlire, amire a komponens feljegyzi az aktuális értékeit --- hány termék van a kosárban, be van-e jelentkezve a felhasználó, milyen szöveg van az input mezőben. \end{block} \vspace{0.5em} \begin{itemize} \item Az állapot megváltozásakor a React \textbf{automatikusan újrarendereli} az érintett komponenst. \item Az állapot a komponensen \emph{belül} él --- más komponens nem látja közvetlenül. \end{itemize} \end{frame} \begin{frame}{Állapot típusok a gyakorlatban} \begin{itemize} \item \textbf{Lokális UI állapot:} csak egy komponenst érint --- pl. le van-e hajtva egy dropdown, aktív-e egy fül. \item \textbf{Megosztott állapot:} több komponens is olvas vagy ír belőle --- pl. a bejelentkezett felhasználó neve. \item \textbf{Szerverállapot:} API-ból érkező, kiszolgálón élő adat, amelyet le kell kérni és szinkronban kell tartani. \item \textbf{URL állapot:} az aktuális útvonal, query paraméterek --- természetesen megosztható és könyvjelzőzhető. \end{itemize} \end{frame} \begin{frame}{Egyirányú adatfolyam} \begin{block}{Mi ez pontosan?} Reactben az adatok mindig \textbf{szülőtől gyermek felé} áramlanak (props-on keresztül). A gyermek \emph{nem módosíthatja} a szülő állapotát közvetlenül --- csak egy callback függvényen (eseménykezelőn) keresztül jelezhet vissza. \end{block} \vspace{0.5em} \begin{itemize} \item Ezért kiszámítható: mindig tudjuk, honnan ered egy érték. \item Hibakeresés könnyebb --- az adatfolyamot felfelé haladva követhetjük. \end{itemize} \end{frame} \begin{frame}{State emelés (Lifting State Up)} \begin{itemize} \item Ha két testvérkomponensnek ugyanazt az adatot kell látnia, az állapotot a legközelebbi közös ősbe \textbf{emeljük fel}. \item Az ős kezeli az állapotot, és props-on keresztül osztja szét a gyermekek között. \item \textbf{Példa:} egy szűrő mező és egy lista --- mindkettőnek ugyanaz a szűrési feltétel kell, ezért azt a szülőben tároljuk. \end{itemize} \end{frame} \begin{frame}{Mikor kell külső állapotkezelő?} \begin{itemize} \item Ha az állapot emelése sok szinten keresztül megy, és a köztes komponensek csak "átpasszolják" --- ezt hívjuk \textbf{prop drilling}-nek. \item Ha az állapot nagyon sok helyen kell, és bonyolult szinkronizálás szükséges. \item Külső megoldások: \textbf{Redux Toolkit} (nagy, komplex alkalmazásokhoz), \textbf{Zustand} (könnyű, egyszerű API), \textbf{Jotai} (atomi, finomhangolt). \item Legtöbb esetben a beépített eszközök (useState + Context) elegendők --- ne bonyolítsuk túl. \end{itemize} \end{frame}