TL'DR: Van mód az állapotváltozások pesszimista működtetésére, miközben a useEffect-et használjuk API-hívásokhoz?
Tegyük fel, hogy írt egy komponenst, amely oldalszámozott/rendezett adatrácsot jelenít meg, és ehhez a hamis példához hasonló useEffect-et írt:
useEffect(() => {
fetch(`https://some-random-api.com/data/page/{paging}/sort/{sorting}`)
.then(response => response.json())
.then(data => setState({
data
}));
}, [paging, sorting]);
Tehát, ha nem tévedek, ez a lapozási vagy rendezési állapotok / kellékek (whatev) frissítésekor lekéri. Ez azt jelenti, hogy az adatok betöltése előtt optimistán jeleníti meg az új rendezési és lapozási állapotokat. Alapvetően az alkalmazás azt mondja a felhasználónak: "A kért oldalon vagyok a kért rendezéssel, de még mindig betöltöm". Más szavakkal, az alkalmazás állapotának egy része (a lapozás és a rendezés) azt mondja, hogy "kész vagyok", az állapot másik része (a betöltés) pedig azt mondja, hogy "dolgozom rajta".
Ezzel szemben, ha pesszimistán frissítenék az állapotokat, csak a betöltési állapotot állítanám igazra a lekérés előtt, majd a válasz beérkezésekor (és csak ezután) állítanám be a lapozást, a rendezést (& adatok és betöltés). Tehát az alkalmazás azt mondja a felhasználónak, hogy "Hallottam, és most dolgozom rajta", majd amikor sikeres válasz érkezik, az alkalmazás azt mondja, hogy "itt vannak a kért adatok és a frissített kontextus (frissített oldal / rendezési állapot)".
A másik probléma, ha a kérés sikertelen. Az optimisitic/useEffect megközelítésben most vissza kell állítanom azokat a lapozási és rendezési állapotokat, amelyeket frissítettek, mielőtt megpróbálnám betölteni az állapotváltozásokhoz szükséges adatokat. Ez a bonyolultság a függőségek számával nő. Ráadásul itt van a kicker (ismét, ha nem tévedek), ezen állapotok visszaállítása újabb lekérést eredményez (ami ismét meghiúsulhat). A pesszimista megközelítésben csak a loading = false értéket állítja be, ha hiba történik, és nincs más állapotmódosítás, mivel a lapozás és a rendezés csak akkor frissül, ha az adatok sikeresen megérkeztek. Az adatok pesszimista megközelítésben szinkronban maradnak (nem optimisták), ezért gondolom ironikusnak, ha a blogok és videók azt mondják, hogy "gondolkodj a szinkronizálásban" a useEffect használatakor.
Még egy dolog, mondjuk a useEffect-en belül meghívott API (egy másik példában) valójában megváltoztatott valamit a szerver oldalon. Ebben az esetben a useEffect használata és annak optimista megközelítése csak hazudik a felhasználónak. Az alkalmazás azt mondja: "Ok, frissítettem". Talán nem. Ha nem (ha hiba történt), akkor remélhetőleg van állapotfrissítés, amely visszaállítja a felhasználónak hazudott állapotváltozást, és valahogy elkerüli a további API-hívást az állapot visszaállításakor. És remélhetőleg a felhasználó látta, hogy az állapot megváltozott, és remélhetőleg volt egy üzenet... Akkor is jó UX?
Nem azt mondom, hogy az optimista megjelenítés mindig rossz. Azt mondom: "Az idő nagy részében szeretek pesszimista lenni. Hogyan tudom ezt megtenni a useEffect használata közben?" :)
Úgy tűnik, hogy a useEffect-et az alkalmazások legtöbb mellékhatására használják és reklámozzák (SOK). Nem túl gyakran találom hasznosnak. Pesszimista vagyok, és szeretnék egy alternatívát bevezetni.