Ismerje meg a React Server Action válaszfolyamot a progresszív űrlapválaszokhoz. Tanulja meg, hogyan építhet gyorsabb, reszponzívabb űrlapokat a jobb felhasználói élmény érdekében.
React Server Action Válaszfolyam: Progresszív űrlapválasz a jobb felhasználói élményért
A React Server Actions egy erőteljes paradigmaváltást hoz abba, ahogyan a szerveroldali műveleteket kezeljük a React alkalmazásainkban. Az egyik legizgalmasabb funkció a válaszok progresszív streamelésének lehetősége, amely lehetővé teszi, hogy azonnali visszajelzést adjunk a felhasználóknak még a teljes művelet befejezése előtt. Ez különösen előnyös űrlapok esetében, ahol reszponzívabb és lebilincselőbb felhasználói élményt hozhatunk létre azáltal, hogy a felhasználói felületet az adatok rendelkezésre állásával párhuzamosan frissítjük.
A React Server Actions megértése
A Server Actions aszinkron függvények, amelyek a szerveren futnak, és React komponensekből indíthatók. Számos előnyt kínálnak a hagyományos API hívásokkal szemben:
- Fokozott biztonság: A Server Actions közvetlenül a szerveren fut, csökkentve az érzékeny adatok vagy logika kliensoldali felfedésének kockázatát.
- Kevesebb sablonkód: Megszüntetik a különálló API útvonalak és adatkérési logika szükségességét a kliensoldalon.
- Növelt teljesítmény: Kihasználhatják a szerveroldali renderelést (SSR) és a gyorsítótárazást a gyorsabb kezdeti betöltési idők és a jobb teljesítmény érdekében.
- Típusbiztonság: A TypeScripttel a Server Actions végpontok közötti típusbiztonságot nyújt, biztosítva az adatok konzisztenciáját a kliens és a szerver között.
A válaszfolyam ereje
A hagyományos űrlapküldések gyakran magukban foglalják az összes adat szerverre küldését, a válaszra való várakozást, majd a felhasználói felület ennek megfelelő frissítését. Ez érzékelhető késleltetéshez vezethet, különösen összetett űrlapok vagy lassú hálózati kapcsolatok esetén. A válaszfolyam lehetővé teszi, hogy a szerver darabokban küldje vissza az adatokat a kliensnek, így progresszíven frissíthetjük a felhasználói felületet, ahogy az adatok elérhetővé válnak.
Képzeljen el egy űrlapot, amely egy bonyolult árat számol ki a felhasználói bevitel alapján. Ahelyett, hogy megvárná a teljes számítás befejezését, a szerver köztes eredményeket streamelhet vissza a kliensnek, valós idejű visszajelzést adva a felhasználónak. Ez jelentősen javíthatja a felhasználói élményt, és reszponzívabbnak érezteti az alkalmazást.
Progresszív űrlapválasz implementálása Server Actions segítségével
Nézzünk végig egy példát arra, hogyan implementálhatunk progresszív űrlapválaszt React Server Actions segítségével.
Példa: Valós idejű pénzváltó
Létrehozunk egy egyszerű pénzváltó űrlapot, amely valós idejű árfolyam-frissítéseket biztosít, miközben a felhasználó beírja az összeget.
1. A Server Action beállítása
Először definiáljuk a Server Actiont, amely a pénzváltást kezeli.
// server/actions.ts
'use server';
import { unstable_cache } from 'next/cache';
async function getExchangeRate(fromCurrency: string, toCurrency: string): Promise<number> {
// Külső API-ból történő árfolyam lekérésének szimulálása
console.log(`Fetching exchange rate for ${fromCurrency} to ${toCurrency}`);
await new Promise(resolve => setTimeout(resolve, 500)); // Hálózati késleltetés szimulálása
if (fromCurrency === 'USD' && toCurrency === 'EUR') return 0.92;
if (fromCurrency === 'EUR' && toCurrency === 'USD') return 1.09;
if (fromCurrency === 'USD' && toCurrency === 'JPY') return 145;
if (fromCurrency === 'JPY' && toCurrency === 'USD') return 0.0069;
throw new Error(`Exchange rate not found for ${fromCurrency} to ${toCurrency}`);
}
export const convertCurrency = async (prevState: any, formData: FormData) => {
const fromCurrency = formData.get('fromCurrency') as string;
const toCurrency = formData.get('toCurrency') as string;
const amount = Number(formData.get('amount'));
try {
if (!fromCurrency || !toCurrency || isNaN(amount)) {
return { message: 'Kérjük, adjon meg érvényes adatokat.' };
}
// A válasz streamelésének szimulálása
await new Promise(resolve => setTimeout(resolve, 250));
const exchangeRate = await unstable_cache(
async () => getExchangeRate(fromCurrency, toCurrency),
[`exchange-rate-${fromCurrency}-${toCurrency}`],
{ tags: [`exchange-rate-${fromCurrency}-${toCurrency}`] }
)();
await new Promise(resolve => setTimeout(resolve, 250));
const convertedAmount = amount * exchangeRate;
return { message: `Átváltott összeg: ${convertedAmount.toFixed(2)} ${toCurrency}` };
} catch (e: any) {
console.error(e);
return { message: 'Nem sikerült átváltani a pénznemet.' };
}
};
Ebben a példában a convertCurrency
Server Action lekéri az árfolyamot (késleltetéssel szimulálva) és kiszámítja az átváltott összeget. Mesterséges késleltetéseket adtunk hozzá a setTimeout
segítségével, hogy szimuláljuk a hálózati késleltetést és bemutassuk a streaming hatást.
2. A React komponens implementálása
Ezután létrehozzuk a React komponenst, amely a Server Actiont használja.
// app/page.tsx
'use client';
import { useState, useTransition } from 'react';
import { convertCurrency } from './server/actions';
import { useFormState } from 'react-dom';
export default function CurrencyConverter() {
const [fromCurrency, setFromCurrency] = useState('USD');
const [toCurrency, setToCurrency] = useState('EUR');
const [amount, setAmount] = useState('');
const [isPending, startTransition] = useTransition();
const [state, formAction] = useFormState(convertCurrency, { message: '' });
const handleSubmit = async (event: React.FormEvent) => {
event.preventDefault();
startTransition(() => {
formAction(new FormData(event.target as HTMLFormElement));
});
};
return (
<div>
<h2>Valós idejű pénzváltó</h2>
<form action={handleSubmit}>
<label htmlFor="fromCurrency">Honnan:</label>
<select id="fromCurrency" name="fromCurrency" value={fromCurrency} onChange={(e) => setFromCurrency(e.target.value)}>
<option value="USD">USD</option>
<option value="EUR">EUR</option>
<option value="JPY">JPY</option>
</select>
<label htmlFor="toCurrency">Hova:</label>
<select id="toCurrency" name="toCurrency" value={toCurrency} onChange={(e) => setToCurrency(e.target.value)}>
<option value="EUR">EUR</option>
<option value="USD">USD</option>
<option value="JPY">JPY</option>
</select>
<label htmlFor="amount">Összeg:</label>
<input
type="number"
id="amount"
name="amount"
value={amount}
onChange={(e) => setAmount(e.target.value)}
/>
<button type="submit" disabled={isPending}>
{isPending ? 'Átváltás...' : 'Átvált'}
</button>
</form>
<p>{state.message}</p>
</div>
);
}
Kulcsfontosságú pontok:
- A
useFormState
hookot használjuk az űrlap állapotának kezelésére és a Server Action meghívására. - A
useTransition
-ből származóisPending
állapot letiltja a küldés gombot és egy "Átváltás..." üzenetet jelenít meg, amíg a művelet fut, visszajelzést adva a felhasználónak. - A
useFormState
által visszaadottformAction
függvény automatikusan kezeli az űrlapküldést és frissíti az állapotot a Server Action-ből kapott válasszal.
3. A progresszív frissítések megértése
Amikor a felhasználó elküldi az űrlapot, a handleSubmit
függvény hívódik meg. Létrehoz egy FormData
objektumot az űrlapból, és átadja azt a formAction
függvénynek. A Server Action ezután a szerveren fut le. A Server Action-ben bevezetett mesterséges késleltetések miatt a következőket figyelheti meg:
- A küldés gomb szinte azonnal "Átváltás..."-ra változik.
- Egy rövid (250ms) késleltetés után a kód szimulálja az árfolyam lekérését.
- Az átváltott összeg kiszámításra kerül, és az eredmény visszaküldésre kerül a kliensnek.
- A React komponensben a
state.message
frissül, megjelenítve az átváltott összeget.
Ez bemutatja, hogyan teszi lehetővé a válaszfolyam, hogy köztes frissítéseket nyújtsunk a felhasználónak, ahogy az adatok elérhetővé válnak, ami reszponzívabb és lebilincselőbb felhasználói élményt eredményez.
A progresszív űrlapválasz előnyei
- Jobb felhasználói élmény: Azonnali visszajelzést nyújt a felhasználóknak, ami reszponzívabbnak és kevésbé lomhának érezteti az alkalmazást.
- Csökkentett észlelt késleltetés: A köztes eredmények megjelenítésével a felhasználók gyorsabbnak érzékelik a folyamatot, még akkor is, ha a teljes művelet ugyanannyi ideig tart.
- Fokozott elköteleződés: A valós idejű frissítésekkel leköti a felhasználókat, és megakadályozza, hogy az észlelt késések miatt elhagyják az űrlapot.
- Magasabb konverziós arányok: A simább és reszponzívabb felhasználói élmény magasabb konverziós arányokhoz vezethet, különösen összetett űrlapok esetében.
Haladó technikák
1. A `useOptimistic` használata az azonnali UI frissítésekhez
A useOptimistic
hook lehetővé teszi, hogy optimistán frissítse a felhasználói felületet, még mielőtt a Server Action befejeződne. Ez még gyorsabb érzékelt válaszidőt biztosíthat, mivel a felhasználói felület azonnal tükrözi a várt eredményt.
import { useOptimistic } from 'react';
function MyComponent() {
const [optimisticState, addOptimistic] = useOptimistic(
initialState,
(state, newUpdate) => {
// Visszaadja az új állapotot a frissítés alapján
return { ...state, ...newUpdate };
}
);
const handleClick = async () => {
addOptimistic({ someValue: 'optimista frissítés' });
await myServerAction();
};
return (
<div>
<p>{optimisticState.someValue}</p>
<button onClick={handleClick}>Frissítés</button>
</div>
);
}
A pénzváltó példában optimistán frissíthetné az átváltott összeget a jelenlegi árfolyam alapján, azonnali előnézetet biztosítva a felhasználónak, mielőtt a tényleges számítás befejeződne a szerveren. Ha a szerver hibát ad vissza, visszaállíthatja az optimista frissítést.
2. Hibakezelés és tartalék mechanizmusok implementálása
Kulcsfontosságú a robusztus hibakezelés és tartalék mechanizmusok implementálása azon esetek kezelésére, amikor a Server Action meghiúsul, vagy a hálózati kapcsolat megszakad. A try...catch
blokkot használhatja a Server Action-ön belül a hibák elfogására és egy megfelelő hibaüzenet visszaküldésére a kliensnek.
// server/actions.ts
export const convertCurrency = async (prevState: any, formData: FormData) => {
// ...
try {
// ...
} catch (error: any) {
console.error(error);
return { message: 'Hiba történt a pénznem átváltása során. Kérjük, próbálja újra később.' };
}
};
A kliensoldalon megjelenítheti a hibaüzenetet a felhasználónak, és lehetőséget biztosíthat a művelet újbóli megkísérlésére vagy a támogatás felvételére.
3. Árfolyamok gyorsítótárazása a teljesítmény érdekében
Az árfolyamok külső API-ból történő lekérése teljesítménybeli szűk keresztmetszetet jelenthet. A teljesítmény javítása érdekében gyorsítótárazhatja az árfolyamokat egy olyan mechanizmussal, mint a Redis vagy a Memcached. A Next.js-ből származó unstable_cache
(ahogy a példában is használva van) beépített gyorsítótárazási megoldást kínál. Ne felejtse el időszakosan érvényteleníteni a gyorsítótárat, hogy az árfolyamok naprakészek legyenek.
4. Nemzetköziesítési szempontok
Amikor globális közönség számára készítünk alkalmazásokat, fontos figyelembe venni a nemzetköziesítést (i18n). Ez magában foglalja a következőket:
- Számformázás: Használjon megfelelő számformátumokat a különböző helyi beállításokhoz (pl. vessző vagy pont használata tizedes elválasztóként).
- Pénznemformázás: Jelenítse meg a pénznem szimbólumokat és formátumokat a felhasználó helyi beállításainak megfelelően.
- Dátum- és időformázás: Használjon megfelelő dátum- és időformátumokat a különböző helyi beállításokhoz.
- Lokalizáció: Fordítsa le a felhasználói felületet különböző nyelvekre.
Az olyan könyvtárak, mint az Intl
és a react-intl
, segíthetnek az i18n implementálásában a React alkalmazásaiban.
Valós példák és felhasználási esetek
- E-kereskedelem: Valós idejű szállítási költségek és szállítási becslések megjelenítése, miközben a felhasználó termékeket ad a kosarához.
- Pénzügyi alkalmazások: Valós idejű tőzsdei árfolyamok és portfólió-frissítések biztosítása.
- Utazásfoglalás: Valós idejű repülőjegyárak és rendelkezésre állás megjelenítése.
- Adatvizualizáció: Adatfrissítések streamelése diagramokhoz és grafikonokhoz.
- Együttműködési eszközök: Valós idejű frissítések megjelenítése dokumentumokon és projekteken.
Összegzés
A React Server Action válaszfolyam egy hatékony módszert kínál a React alkalmazások felhasználói élményének javítására. A progresszív űrlapválaszok biztosításával gyorsabb, reszponzívabb és lebilincselőbb űrlapokat hozhat létre, amelyek lekötik a felhasználókat és javítják a konverziós arányokat. A válaszfolyam és az olyan technikák, mint az optimista frissítések és a gyorsítótárazás kombinálásával valóban kivételes felhasználói élményt építhet.
Ahogy a React Server Actions tovább fejlődik, még erőteljesebb funkciók és képességek megjelenésére számíthatunk, amelyek tovább egyszerűsítik a komplex és dinamikus webalkalmazások fejlesztését.
További források
Ez az útmutató átfogó áttekintést nyújt a React Server Action válaszfolyamról és annak alkalmazásáról a progresszív űrlapválaszokra. Az itt tárgyalt koncepciók és technikák megértésével kihasználhatja ezt az erőteljes funkciót gyorsabb, reszponzívabb és lebilincselőbb webalkalmazások készítéséhez.