Išsamus React useFormStatus hook'o vadovas, padedantis programuotojams kurti įtraukias ir informatyvias formų pateikimo patirtis pasaulio vartotojams.
React useFormStatus: Formos pateikimo būsenos įvaldymas
Formos yra daugybės interneto programų pagrindas, pagrindinė priemonė vartotojams sąveikauti su serveriais ir teikti jiems duomenis. Sklandaus ir informatyvaus formos pateikimo proceso užtikrinimas yra itin svarbus norint sukurti teigiamą vartotojo patirtį. React 18 pristatė galingą hook'ą, vadinamą useFormStatus
, skirtą supaprastinti formos pateikimo būsenos valdymą. Šis vadovas pateikia išsamią useFormStatus
apžvalgą, nagrinėja jo funkcijas, panaudojimo atvejus ir geriausias praktikas, kaip kurti prieinamas ir įtraukiančias formas pasaulinei auditorijai.
Kas yra React useFormStatus?
useFormStatus
yra React Hook'as, teikiantis informaciją apie formos pateikimo būseną. Jis sukurtas sklandžiai veikti su serverio veiksmais (server actions) – funkcija, leidžiančia vykdyti serverio logiką tiesiogiai iš jūsų React komponentų. Hook'as grąžina objektą, kuriame yra informacija apie formos laukimo būseną, duomenis ir visas klaidas, įvykusias pateikimo metu. Ši informacija leidžia jums teikti grįžtamąjį ryšį vartotojams realiuoju laiku, pavyzdžiui, rodyti krovimo indikatorius, išjungti formos elementus ir rodyti klaidų pranešimus.
Serverio veiksmų supratimas
Prieš gilinantis į useFormStatus
, būtina suprasti serverio veiksmus. Serverio veiksmai yra asinchroninės funkcijos, kurios veikia serveryje ir gali būti iškviestos tiesiogiai iš React komponentų. Jos apibrėžiamos naudojant 'use server'
direktyvą failo viršuje. Serverio veiksmai dažniausiai naudojami tokioms užduotims kaip:
- Formos duomenų pateikimas į duomenų bazę
- Vartotojų autentifikavimas
- Mokėjimų apdorojimas
- El. laiškų siuntimas
Štai paprastas serverio veiksmo pavyzdys:
// actions.js
'use server';
export async function submitForm(formData) {
// Imituojamas delsimas, siekiant atkartoti serverio užklausą
await new Promise(resolve => setTimeout(resolve, 2000));
const name = formData.get('name');
const email = formData.get('email');
if (!name || !email) {
return { message: 'Užpildykite visus laukus.' };
}
// Imituojamas sėkmingas pateikimas
return { message: `Forma sėkmingai pateikta vartotojui ${name}!` };
}
Šis veiksmas priima formos duomenis kaip įvestį, imituoja delsą ir tada grąžina sėkmės arba klaidos pranešimą. 'use server'
direktyva nurodo React, kad ši funkcija turėtų būti vykdoma serveryje.
Kaip veikia useFormStatus
useFormStatus
hook'as naudojamas komponente, kuris atvaizduoja formą. Jis turi būti naudojamas <form>
elemento viduje, kuris naudoja `action` atributą su importuotu serverio veiksmu.
Hook'as grąžina objektą su šiomis savybėmis:
pending
: loginė reikšmė (boolean), nurodanti, ar forma šiuo metu yra pateikiama.data
: duomenys, kurie buvo pateikti su forma. Busnull
, jei forma dar nebuvo pateikta.method
: HTTP metodas, naudojamas formai pateikti (pvz., „POST“, „GET“).action
: serverio veiksmo funkcija, susieta su forma.error
: klaidos objektas, jei formos pateikimas nepavyko. Busnull
, jei pateikimas buvo sėkmingas arba dar nebuvo bandytas. Svarbu: klaida nėra automatiškai išmetama. Serverio veiksmas turi aiškiai grąžinti klaidos objektą arba jį išmesti.
Štai pavyzdys, kaip naudoti useFormStatus
React komponente:
'use client'
import { useFormStatus } from 'react-dom';
import { submitForm } from './actions';
function MyForm() {
const { pending, data, error, action } = useFormStatus();
return (
<form action={submitForm}>
<label htmlFor="name">Vardas:</label>
<input type="text" id="name" name="name" disabled={pending} />
<label htmlFor="email">El. paštas:</label>
<input type="email" id="email" name="email" disabled={pending} />
<button type="submit" disabled={pending}>
{pending ? 'Pateikiama...' : 'Pateikti'}
</button>
{error && <p style={{ color: 'red' }}>Klaida: {error.message}</p>}
{data && data.message && <p style={{ color: 'green' }}>{data.message}</p>}
</form>
);
}
export default MyForm;
Šiame pavyzdyje:
- Mes importuojame
useFormStatus
iš'react-dom'
irsubmitForm
serverio veiksmą iš./actions
. - Mes naudojame
useFormStatus
, kad gautume dabartinę formos pateikimo būseną. - Mes išjungiame įvesties laukus ir pateikimo mygtuką, kol forma yra laukimo būsenoje.
- Mes rodome krovimo pranešimą, kol forma yra laukimo būsenoje.
- Mes rodome klaidos pranešimą, jei formos pateikimas nepavyksta.
- Mes rodome sėkmės pranešimą, jei formos pateikimas pavyksta.
useFormStatus naudojimo privalumai
useFormStatus
siūlo keletą privalumų valdant formos pateikimo būseną:
- Supaprastintas būsenos valdymas: Pašalina poreikį rankiniu būdu valdyti krovimo būseną, klaidų būseną ir formos duomenis.
- Geresnė vartotojo patirtis: Leidžia teikti grįžtamąjį ryšį vartotojams realiuoju laiku, todėl formos pateikimo procesas tampa intuityvesnis ir įtraukiantis.
- Pagerintas prieinamumas: Išjungdami formos elementus pateikimo metu, neleidžiate vartotojams netyčia pateikti formą kelis kartus.
- Sklandi integracija su serverio veiksmais: Sukurtas specialiai darbui su serverio veiksmais, užtikrinant sklandų ir efektyvų formų pateikimo valdymą.
- Mažiau standartinio kodo (boilerplate): Sumažina kodo, reikalingo formų pateikimui tvarkyti, kiekį.
Geriausios useFormStatus naudojimo praktikos
Norėdami maksimaliai išnaudoti useFormStatus
privalumus, atsižvelkite į šias geriausias praktikas:
- Teikite aiškų grįžtamąjį ryšį: Naudokite
pending
būseną, kad parodytumėte krovimo indikatorių arba išjungtumėte formos elementus, siekiant išvengti pakartotinių pateikimų. Tai gali būti paprastas suktukas (spinner), progreso juosta arba tekstinis pranešimas, pavyzdžiui, „Pateikiama...“. Atsižvelkite į prieinamumą ir įsitikinkite, kad ekrano skaitytuvai tinkamai praneša apie krovimo indikatorių. - Tinkamai apdorokite klaidas: Rodykite informatyvius klaidų pranešimus, kad padėtumėte vartotojams suprasti, kas nutiko ne taip ir kaip tai ištaisyti. Pritaikykite klaidų pranešimus vartotojo kalbai ir kultūriniam kontekstui. Venkite techninio žargono ir pateikite aiškias, veiksmingas instrukcijas.
- Validuokite duomenis serveryje: Visada validuokite formos duomenis serveryje, kad išvengtumėte kenkėjiškos įvesties ir užtikrintumėte duomenų vientisumą. Serverio pusės validavimas yra labai svarbus saugumui ir duomenų kokybei. Apsvarstykite galimybę įdiegti tarptautinimą (i18n) serverio pusės validavimo pranešimams.
- Naudokite progresyvų tobulinimą (progressive enhancement): Užtikrinkite, kad jūsų forma veiktų net ir išjungus JavaScript. Tai apima standartinių HTML formos elementų naudojimą ir formos pateikimą į serverio galinį tašką (endpoint). Tada laipsniškai tobulinkite formą su JavaScript, kad suteiktumėte turtingesnę vartotojo patirtį.
- Atsižvelkite į prieinamumą: Naudokite ARIA atributus, kad jūsų forma būtų prieinama vartotojams su negalia. Pavyzdžiui, naudokite
aria-describedby
, kad susietumėte klaidų pranešimus su atitinkamais formos laukais. Laikykitės Interneto turinio prieinamumo gairių (WCAG), kad užtikrintumėte, jog jūsų forma yra naudojama visiems. - Optimizuokite našumą: Venkite nereikalingų pervaizdavimų (re-renders) naudodami
React.memo
ar kitas optimizavimo technikas. Stebėkite savo formos našumą ir nustatykite bet kokias kliūtis. Apsvarstykite galimybę naudoti komponentų atidėtąjį įkėlimą (lazy-loading) arba kodo skaidymą, siekiant pagerinti pradinį įkėlimo laiką. - Įdiekite užklausų ribojimą (rate limiting): Apsaugokite savo serverį nuo piktnaudžiavimo įdiegdami užklausų ribojimą. Tai neleis vartotojams pateikti formos per daug kartų per trumpą laiką. Apsvarstykite galimybę naudoti tokias paslaugas kaip „Cloudflare“ ar „Akamai“, kad užklausų ribojimas būtų valdomas kraštiniame tinkle (edge).
useFormStatus panaudojimo atvejai
useFormStatus
yra taikomas įvairiuose scenarijuose:
- Kontaktų formos: Teikiant grįžtamąjį ryšį pateikimo metu ir tvarkant galimas klaidas.
- Prisijungimo/registracijos formos: Rodant krovimo būsenas autentifikacijos metu ir rodant klaidų pranešimus dėl neteisingų prisijungimo duomenų.
- El. prekybos atsiskaitymo formos: Rodant krovimo indikatorius mokėjimo apdorojimo metu ir tvarkant klaidas, susijusias su neteisinga kredito kortelės informacija ar nepakankamomis lėšomis. Apsvarstykite integraciją su mokėjimo sistemomis, kurios palaiko kelias valiutas ir kalbas.
- Duomenų įvedimo formos: Išjungiant formos elementus pateikimo metu, siekiant išvengti netyčinio duomenų dubliavimo.
- Paieškos formos: Rodant krovimo indikatorių, kol gaunami paieškos rezultatai.
- Nustatymų puslapiai: Teikiant vizualias užuominas, kai nustatymai yra išsaugomi.
- Apklausos ir testai: Valdant atsakymų pateikimą ir rodant grįžtamąjį ryšį.
Tarptautinimo (i18n) sprendimai
Kuriant formas pasaulinei auditorijai, tarptautinimas (i18n) yra labai svarbus. Štai kaip spręsti i18n problemas naudojant useFormStatus
:
- Išverskite klaidų pranešimus: Laikykite klaidų pranešimus vertimų faile ir naudokite biblioteką, pvz.,
react-intl
arbai18next
, kad būtų rodomas atitinkamas pranešimas pagal vartotojo lokalę. Įsitikinkite, kad klaidų pranešimai yra aiškūs, glausti ir kultūriškai tinkami. - Formatuokite skaičius ir datas: Naudokite
Intl
API, kad formatuotumėte skaičius ir datas pagal vartotojo lokalę. Tai užtikrins, kad skaičiai ir datos bus rodomi teisingu formatu jų regionui. - Tvarkykite skirtingus datų ir laiko formatus: Pateikite įvesties laukus, kurie palaiko skirtingus datų ir laiko formatus. Naudokite biblioteką, pvz.,
react-datepicker
, kad pateiktumėte lokalizuotą datos parinkiklį. - Palaikykite kalbas iš dešinės į kairę (RTL): Užtikrinkite, kad jūsų formos išdėstymas veiktų teisingai RTL kalboms, tokioms kaip arabų ir hebrajų. Naudokite CSS logines savybes išdėstymo korekcijoms tvarkyti.
- Naudokite lokalizacijos biblioteką: Pasitelkite patikimą i18n biblioteką vertimams valdyti ir lokalės specifiniam formatavimui tvarkyti.
Pavyzdys su i18next:
// i18n.js
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import en from './locales/en.json';
import lt from './locales/lt.json'; // Pakeista iš fr į lt
i18n
.use(initReactI18next)
.init({
resources: {
en: { translation: en },
lt: { translation: lt }, // Pakeista iš fr į lt
},
lng: 'lt', // Nustatyta lietuvių kalba
fallbackLng: 'en',
interpolation: {
escapeValue: false, // react jau apsaugo nuo xss
},
});
export default i18n;
// MyForm.js
import { useTranslation } from 'react-i18next';
function MyForm() {
const { t } = useTranslation();
const { pending, data, error, action } = useFormStatus();
return (
<form action={submitForm}>
<label htmlFor="name">{t('name')}:</label>
<input type="text" id="name" name="name" disabled={pending} />
<label htmlFor="email">{t('email')}:</label>
<input type="email" id="email" name="email" disabled={pending} />
<button type="submit" disabled={pending}>
{pending ? t('submitting') : t('submit')}
</button>
{error && <p style={{ color: 'red' }}>{t('error')}: {t(error.message)}</p>}
{data && data.message && <p style={{ color: 'green' }}>{t(data.message)}</p>}
</form>
);
}
export default MyForm;
Prieinamumo aspektai
Užtikrinti prieinamumą kuriant formas yra svarbiausia. Štai kaip padaryti jūsų formas prieinamesnes naudojant useFormStatus
:
- Naudokite ARIA atributus: Naudokite ARIA atributus, tokius kaip
aria-invalid
,aria-describedby
iraria-live
, kad pateiktumėte semantinę informaciją pagalbinėms technologijoms. Pavyzdžiui, naudokitearia-invalid="true"
įvesties laukams su validavimo klaidomis iraria-describedby
, kad susietumėte klaidų pranešimus su atitinkamais laukais. Naudokitearia-live="polite"
arbaaria-live="assertive"
elementams, kurie rodo dinaminį turinį, pvz., krovimo indikatorius ir klaidų pranešimus. - Užtikrinkite naršymą klaviatūra: Užtikrinkite, kad vartotojai galėtų naršyti formą naudodami klaviatūrą. Naudokite
tabindex
atributą, kad valdytumėte elementų fokusavimo tvarką. - Naudokite semantinį HTML: Naudokite semantinius HTML elementus, tokius kaip
<label>
,<input>
,<button>
ir<fieldset>
, kad suteiktumėte savo formai struktūrą ir prasmę. - Pateikite aiškias etiketes: Naudokite aiškias ir aprašančias etiketes visiems formos laukams. Susiekite etiketes su atitinkamais įvesties laukais naudodami
for
atributą. - Naudokite pakankamą kontrastą: Užtikrinkite, kad tarp teksto ir fono spalvų būtų pakankamas kontrastas. Naudokite spalvų kontrasto tikrintuvą, kad patikrintumėte, ar jūsų spalvos atitinka prieinamumo gaires.
- Testuokite su pagalbinėmis technologijomis: Išbandykite savo formą su pagalbinėmis technologijomis, tokiomis kaip ekrano skaitytuvai, kad užtikrintumėte, jog ji yra naudojama žmonėms su negalia.
Pavyzdys su ARIA atributais:
function MyForm() {
const { pending, data, error, action } = useFormStatus();
return (
<form action={submitForm}>
<label htmlFor="name">Vardas:</label>
<input
type="text"
id="name"
name="name"
disabled={pending}
aria-invalid={!!error} // Nurodo, ar yra klaida
aria-describedby={error ? 'name-error' : null} // Susieja klaidos pranešimą
/>
{error && (
<p id="name-error" style={{ color: 'red' }} aria-live="polite">{error.message}</p>
)}
<label htmlFor="email">El. paštas:</label>
<input type="email" id="email" name="email" disabled={pending} />
<button type="submit" disabled={pending}>
{pending ? 'Pateikiama...' : 'Pateikti'}
</button>
{data && data.message && <p style={{ color: 'green' }}>{data.message}</p>}
</form>
);
}
Daugiau nei pagrindai: pažangios technikos
Nors pagrindinis useFormStatus
naudojimas yra paprastas, kelios pažangios technikos gali dar labiau pagerinti jūsų formos pateikimo patirtį:
- Individualūs krovimo indikatoriai: Vietoj paprasto suktuko naudokite vizualiai patrauklesnį ir informatyvesnį krovimo indikatorių. Tai gali būti progreso juosta, individuali animacija arba pranešimas, suteikiantis konteksto apie tai, kas vyksta fone. Užtikrinkite, kad jūsų individualūs krovimo indikatoriai būtų prieinami ir turėtų pakankamą kontrastą.
- Optimistiniai atnaujinimai: Suteikite vartotojui greitą grįžtamąjį ryšį optimistiškai atnaujindami vartotojo sąsają (UI) prieš serveriui atsakant. Tai gali padaryti formą jautresnę ir sumažinti suvokiamą delsą. Tačiau būtinai tvarkykite galimas klaidas ir atstatykite UI, jei serverio užklausa nepavyksta.
- Debouncing ir Throttling: Naudokite „debouncing“ arba „throttling“, kad apribotumėte serverio užklausų skaičių, siunčiamų vartotojui renkant tekstą. Tai gali pagerinti našumą ir apsaugoti serverį nuo perkrovos. Bibliotekos, pvz.,
lodash
, teikia įrankius funkcijų „debouncing“ ir „throttling“ vykdymui. - Sąlyginis atvaizdavimas: Sąlygiškai atvaizduokite formos elementus remdamiesi
pending
būsena. Tai gali būti naudinga slepiant ar išjungiant tam tikrus elementus, kol forma yra pateikiama. Pavyzdžiui, galbūt norėsite paslėpti „Atstatyti“ mygtuką, kol forma yra laukimo būsenoje, kad vartotojas netyčia neatstatytų formos. - Integracija su formų validavimo bibliotekomis: Integruokite
useFormStatus
su formų validavimo bibliotekomis, tokiomis kaipFormik
arReact Hook Form
, siekiant visapusiško formų valdymo.
Dažniausių problemų sprendimas
Naudodami useFormStatus
, galite susidurti su kai kuriomis dažnomis problemomis. Štai kaip jas spręsti:
pending
būsena neatsinaujina: Įsitikinkite, kad forma yra teisingai susieta su serverio veiksmu ir kad serverio veiksmas yra tinkamai apibrėžtas. Patikrinkite, ar<form>
elementas turi teisingai nustatytą `action` atributą.error
būsena nėra užpildoma: Įsitikinkite, kad serverio veiksmas grąžina klaidos objektą, kai įvyksta klaida. Serverio veiksmas turi aiškiai grąžinti klaidą arba ją išmesti.- Forma pateikiama kelis kartus: Išjunkite pateikimo mygtuką ar įvesties laukus, kol forma yra laukimo būsenoje, kad išvengtumėte pakartotinių pateikimų.
- Forma nepateikia duomenų: Patikrinkite, ar formos elementai turi teisingai nustatytą
name
atributą. Įsitikinkite, kad serverio veiksmas teisingai apdoroja formos duomenis. - Našumo problemos: Optimizuokite savo kodą, kad išvengtumėte nereikalingų pervaizdavimų ir sumažintumėte apdorojamų duomenų kiekį.
useFormStatus alternatyvos
Nors useFormStatus
yra galingas įrankis, yra alternatyvių būdų valdyti formos pateikimo būseną, ypač senesnėse React versijose arba dirbant su sudėtinga formų logika:
- Rankinis būsenos valdymas: Naudojant
useState
iruseEffect
rankiniam krovimo būsenos, klaidų būsenos ir formos duomenų valdymui. Šis metodas suteikia daugiau kontrolės, bet reikalauja daugiau standartinio kodo. - Formų bibliotekos: Naudojant formų bibliotekas, tokias kaip Formik, React Hook Form ar Final Form. Šios bibliotekos teikia išsamias formų valdymo funkcijas, įskaitant validavimą, pateikimo tvarkymą ir būsenos valdymą. Šios bibliotekos dažnai teikia savo hook'us ar komponentus pateikimo būsenai valdyti.
- Redux arba Context API: Naudojant Redux arba Context API globaliam formos būsenos valdymui. Šis metodas tinka sudėtingoms formoms, kurios naudojamos keliuose komponentuose.
Pasirinkimas priklauso nuo jūsų formos sudėtingumo ir specifinių reikalavimų. Paprastoms formoms useFormStatus
dažnai yra pats tiesiausias ir efektyviausias sprendimas. Sudėtingesnėms formoms gali būti tinkamesnė formų biblioteka arba globalus būsenos valdymo sprendimas.
Išvados
useFormStatus
yra vertingas papildymas React ekosistemai, supaprastinantis formos pateikimo būsenos valdymą ir leidžiantis programuotojams kurti labiau įtraukiančias ir informatyvias vartotojo patirtis. Suprasdami jo funkcijas, geriausias praktikas ir panaudojimo atvejus, galite panaudoti useFormStatus
kurdami prieinamas, tarptautintas ir našias formas pasaulinei auditorijai. useFormStatus
naudojimas supaprastina kūrimo procesą, pagerina vartotojo sąveiką ir galiausiai prisideda prie patikimesnių ir patogesnių interneto programų kūrimo.
Nepamirškite teikti pirmenybės prieinamumui, tarptautinimui ir našumui kuriant formas pasaulinei auditorijai. Laikydamiesi šiame vadove aprašytų geriausių praktikų, galite sukurti formas, kurias gali naudoti visi, nepriklausomai nuo jų buvimo vietos ar gebėjimų. Šis požiūris prisideda prie labiau įtraukiančio ir prieinamo interneto visiems vartotojams.