Norsk

En omfattende guide til Reacts useFormStatus-hook, som gir utviklere muligheten til å skape engasjerende og informative skjemainnsendinger for globale brukere.

React useFormStatus: Mestre tilstanden for skjemainnsending

Skjemaer er ryggraden i utallige webapplikasjoner, og fungerer som den primære måten for brukere å samhandle med og levere data til servere. Å sikre en smidig og informativ prosess for skjemainnsending er avgjørende for å skape positive brukeropplevelser. React 18 introduserte en kraftig hook kalt useFormStatus, designet for å forenkle håndteringen av tilstanden for skjemainnsending. Denne guiden gir en omfattende oversikt over useFormStatus, og utforsker dens funksjoner, bruksområder og beste praksis for å bygge tilgjengelige og engasjerende skjemaer for et globalt publikum.

Hva er React useFormStatus?

useFormStatus er en React Hook som gir informasjon om innsendingsstatusen til et skjema. Den er designet for å fungere sømløst med serverhandlinger (server actions), en funksjon som lar deg utføre logikk på serversiden direkte fra dine React-komponenter. Hooken returnerer et objekt som inneholder informasjon om skjemaets ventestatus, data og eventuelle feil som oppstod under innsendingen. Denne informasjonen lar deg gi sanntids-tilbakemelding til brukere, som å vise lasteindikatorer, deaktivere skjemaelementer og vise feilmeldinger.

Forståelse av serverhandlinger

Før vi dykker ned i useFormStatus, er det viktig å forstå serverhandlinger. Serverhandlinger er asynkrone funksjoner som kjører på serveren og kan kalles direkte fra React-komponenter. De defineres ved å bruke 'use server'-direktivet øverst i filen. Serverhandlinger brukes ofte til oppgaver som:

Her er et enkelt eksempel på en serverhandling:

// actions.js
'use server';

export async function submitForm(formData) {
  // Simuler en forsinkelse for å etterligne en serverforespørsel
  await new Promise(resolve => setTimeout(resolve, 2000));

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

  if (!name || !email) {
    return { message: 'Vennligst fyll ut alle feltene.' };
  }

  // Simuler vellykket innsending
  return { message: `Skjemaet ble sendt inn for ${name}!` };
}

Denne handlingen tar imot skjemadata, simulerer en forsinkelse, og returnerer deretter en suksess- eller feilmelding. 'use server'-direktivet forteller React at denne funksjonen skal utføres på serveren.

Hvordan useFormStatus fungerer

useFormStatus-hooken brukes i en komponent som rendrer et skjema. Den må brukes inne i et <form>-element som bruker `action`-propen med den importerte serverhandlingen. Hooken returnerer et objekt med følgende egenskaper:

Her er et eksempel på hvordan du bruker 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">Navn:</label>
      <input type="text" id="name" name="name" disabled={pending} />
      <label htmlFor="email">E-post:</label>
      <input type="email" id="email" name="email" disabled={pending} />
      <button type="submit" disabled={pending}>
        {pending ? 'Sender inn...' : 'Send inn'}
      </button>
      {error && <p style={{ color: 'red' }}>Feil: {error.message}</p>}
      {data && data.message && <p style={{ color: 'green' }}>{data.message}</p>}
    </form>
  );
}

export default MyForm;

I dette eksempelet:

Fordeler med å bruke useFormStatus

useFormStatus tilbyr flere fordeler for håndtering av tilstanden for skjemainnsending:

Beste praksis for bruk av useFormStatus

For å maksimere fordelene med useFormStatus, bør du vurdere følgende beste praksis:

Bruksområder for useFormStatus

useFormStatus kan brukes i en rekke scenarier:

Håndtering av internasjonalisering (i18n)

Når du bygger skjemaer for et globalt publikum, er internasjonalisering (i18n) avgjørende. Slik håndterer du i18n når du bruker 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;

Hensyn til tilgjengelighet

Å sikre tilgjengelighet er avgjørende når man bygger skjemaer. Slik gjør du skjemaene dine mer tilgjengelige når du bruker useFormStatus:

Eksempel med ARIA-attributter:

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

  return (
    <form action={submitForm}>
      <label htmlFor="name">Navn:</label>
      <input
        type="text"
        id="name"
        name="name"
        disabled={pending}
        aria-invalid={!!error} // Indikerer om det er en feil
        aria-describedby={error ? 'name-error' : null} // Knytter til feilmelding
      />
      {error && (
        <p id="name-error" style={{ color: 'red' }} aria-live="polite">{error.message}</p>
      )}
      <label htmlFor="email">E-post:</label>
      <input type="email" id="email" name="email" disabled={pending} />
      <button type="submit" disabled={pending}>
        {pending ? 'Sender inn...' : 'Send inn'}
      </button>
      {data && data.message && <p style={{ color: 'green' }}>{data.message}</p>}
    </form>
  );
}

Utover grunnleggende bruk: Avanserte teknikker

Selv om den grunnleggende bruken av useFormStatus er enkel, kan flere avanserte teknikker forbedre skjemainnsendingsopplevelsen ytterligere:

Feilsøking av vanlige problemer

Når du bruker useFormStatus, kan du støte på noen vanlige problemer. Slik feilsøker du dem:

Alternativer til useFormStatus

Selv om useFormStatus er et kraftig verktøy, finnes det alternative tilnærminger for å håndtere tilstanden for skjemainnsending, spesielt i eldre React-versjoner eller når man håndterer kompleks skjemalogikk:

Valget av tilnærming avhenger av kompleksiteten til skjemaet ditt og dine spesifikke krav. For enkle skjemaer er useFormStatus ofte den enkleste og mest effektive løsningen. For mer komplekse skjemaer kan et skjemabibliotek eller en global tilstandshåndteringsløsning være mer passende.

Konklusjon

useFormStatus er et verdifullt tillegg til React-økosystemet, som forenkler håndteringen av tilstanden for skjemainnsending og gjør det mulig for utviklere å skape mer engasjerende og informative brukeropplevelser. Ved å forstå funksjonene, beste praksis og bruksområdene, kan du utnytte useFormStatus til å bygge tilgjengelige, internasjonaliserte og ytelsessterke skjemaer for et globalt publikum. Å ta i bruk useFormStatus effektiviserer utviklingen, forbedrer brukerinteraksjonen og bidrar til slutt til mer robuste og brukervennlige webapplikasjoner.

Husk å prioritere tilgjengelighet, internasjonalisering og ytelse når du bygger skjemaer for et globalt publikum. Ved å følge beste praksis som er beskrevet i denne guiden, kan du lage skjemaer som er brukbare for alle, uavhengig av deres plassering eller evner. Denne tilnærmingen bidrar til en mer inkluderende og tilgjengelig web for alle brukere.