Dansk

En omfattende guide til Reacts useFormStatus hook, der giver udviklere mulighed for at skabe engagerende og informative formularindsendelsesoplevelser for globale brugere.

React useFormStatus: Mestring af formularindsendelsestilstand

Formularer er rygraden i utallige webapplikationer og fungerer som det primære middel for brugere til at interagere med og levere data til servere. At sikre en glat og informativ formularindsendelsesproces er afgørende for at skabe positive brugeroplevelser. React 18 introducerede et kraftfuldt hook kaldet useFormStatus, designet til at forenkle håndteringen af formularindsendelsestilstand. Denne guide giver en omfattende oversigt over useFormStatus og udforsker dens funktioner, anvendelsestilfælde og bedste praksis for at bygge tilgængelige og engagerende formularer for et globalt publikum.

Hvad er React useFormStatus?

useFormStatus er et React Hook, der giver information om indsendelsesstatus for en formular. Det er designet til at fungere problemfrit med serverhandlinger, en funktion der giver dig mulighed for at udføre server-side logik direkte fra dine React-komponenter. Hook'et returnerer et objekt, der indeholder information om formularens afventende tilstand, data og eventuelle fejl, der opstod under indsendelsen. Denne information giver dig mulighed for at give realtidsfeedback til brugerne, såsom at vise indlæsningsindikatorer, deaktivere formularelementer og vise fejlmeddelelser.

Forståelse af serverhandlinger

Før vi dykker ned i useFormStatus, er det vigtigt at forstå serverhandlinger. Serverhandlinger er asynkrone funktioner, der kører på serveren og kan kaldes direkte fra React-komponenter. De defineres ved hjælp af 'use server'-direktivet øverst i filen. Serverhandlinger bruges almindeligvis til opgaver som:

Her er et simpelt eksempel på en serverhandling:

// actions.js
'use server';

export async function submitForm(formData) {
  // Simuler en forsinkelse for at efterligne en serveranmodning
  await new Promise(resolve => setTimeout(resolve, 2000));

  const name = formData.get('name');
  const email = formData.get('email');

  if (!name || !email) {
    return { message: 'Please fill in all fields.' };
  }

  // Simuler vellykket indsendelse
  return { message: `Form submitted successfully for ${name}!` };
}

Denne handling tager formulardata som input, simulerer en forsinkelse og returnerer derefter en succes- eller fejlmeddelelse. 'use server'-direktivet fortæller React, at denne funktion skal udføres på serveren.

Hvordan useFormStatus virker

useFormStatus-hook'et bruges i en komponent, der gengiver en formular. Det skal bruges inde i et <form>-element, der bruger `action`-prop'en med den importerede Server Action. Hook'et returnerer et objekt med følgende egenskaber:

Her er et eksempel på, hvordan man bruger useFormStatus i en React-komponent:

'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">Name:</label>
      <input type="text" id="name" name="name" disabled={pending} />
      <label htmlFor="email">Email:</label>
      <input type="email" id="email" name="email" disabled={pending} />
      <button type="submit" disabled={pending}>
        {pending ? 'Submitting...' : 'Submit'}
      </button>
      {error && <p style={{ color: 'red' }}>Error: {error.message}</p>}
      {data && data.message && <p style={{ color: 'green' }}>{data.message}</p>}
    </form>
  );
}

export default MyForm;

I dette eksempel:

Fordele ved at bruge useFormStatus

useFormStatus tilbyder flere fordele ved håndtering af formularindsendelsestilstand:

Bedste praksis for brug af useFormStatus

For at maksimere fordelene ved useFormStatus, overvej følgende bedste praksis:

Anvendelsestilfælde for useFormStatus

useFormStatus kan anvendes i en bred vifte af scenarier:

Håndtering af internationalisering (i18n)

Når man bygger formularer til et globalt publikum, er internationalisering (i18n) afgørende. Sådan håndterer du i18n, når du bruger useFormStatus:

Eksempel med i18next:

// i18n.js
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';

import en from './locales/en.json';
import fr from './locales/fr.json';

i18n
  .use(initReactI18next)
  .init({
    resources: {
      en: { translation: en },
      fr: { translation: fr },
    },
    lng: 'en',
    fallbackLng: 'en',
    interpolation: {
      escapeValue: false, // react already safes from 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;

Overvejelser om tilgængelighed

At sikre tilgængelighed er altafgørende, når man bygger formularer. Sådan gør du dine formularer mere tilgængelige, når du bruger useFormStatus:

Eksempel med ARIA-attributter:

function MyForm() {
  const { pending, data, error, action } = useFormStatus();

  return (
    <form action={submitForm}>
      <label htmlFor="name">Name:</label>
      <input
        type="text"
        id="name"
        name="name"
        disabled={pending}
        aria-invalid={!!error} // Angiv, om der er en fejl
        aria-describedby={error ? 'name-error' : null} // Tilknyt fejlmeddelelse
      />
      {error && (
        <p id="name-error" style={{ color: 'red' }} aria-live="polite">{error.message}</p>
      )}
      <label htmlFor="email">Email:</label>
      <input type="email" id="email" name="email" disabled={pending} />
      <button type="submit" disabled={pending}>
        {pending ? 'Submitting...' : 'Submit'}
      </button>
      {data && data.message && <p style={{ color: 'green' }}>{data.message}</p>}
    </form>
  );
}

Ud over grundlæggende brug: Avancerede teknikker

Selvom den grundlæggende brug af useFormStatus er ligetil, kan flere avancerede teknikker yderligere forbedre din formularindsendelsesoplevelse:

Fejlfinding af almindelige problemer

Når du bruger useFormStatus, kan du støde på nogle almindelige problemer. Sådan fejlfinder du dem:

Alternativer til useFormStatus

Selvom useFormStatus er et kraftfuldt værktøj, findes der alternative tilgange til håndtering af formularindsendelsestilstand, især i ældre React-versioner eller når man arbejder med kompleks formularlogik:

Valget af tilgang afhænger af kompleksiteten af din formular og dine specifikke krav. For simple formularer er useFormStatus ofte den mest ligetil og effektive løsning. For mere komplekse formularer kan et formularbibliotek eller en global tilstandsstyringsløsning være mere passende.

Konklusion

useFormStatus er en værdifuld tilføjelse til React-økosystemet, der forenkler håndteringen af formularindsendelsestilstand og gør det muligt for udviklere at skabe mere engagerende og informative brugeroplevelser. Ved at forstå dens funktioner, bedste praksis og anvendelsestilfælde kan du udnytte useFormStatus til at bygge tilgængelige, internationaliserede og performante formularer til et globalt publikum. At omfavne useFormStatus strømliner udviklingen, forbedrer brugerinteraktionen og bidrager i sidste ende til mere robuste og brugervenlige webapplikationer.

Husk at prioritere tilgængelighed, internationalisering og ydeevne, når du bygger formularer til et globalt publikum. Ved at følge de bedste praksis, der er beskrevet i denne guide, kan du skabe formularer, der kan bruges af alle, uanset deres placering eller evner. Denne tilgang bidrager til et mere inkluderende og tilgængeligt web for alle brugere.