Svenska

En omfattande guide till Reacts useFormStatus-hook, som ger utvecklare möjlighet att skapa engagerande och informativa formulärsändningsupplevelser för globala användare.

React useFormStatus: Bemästra formulärsändningsstatus

Formulär utgör ryggraden i otaliga webbapplikationer och är det primära sättet för användare att interagera med och skicka data till servrar. Att säkerställa en smidig och informativ process för formulärsändning är avgörande för att skapa positiva användarupplevelser. React 18 introducerade en kraftfull hook kallad useFormStatus, utformad för att förenkla hanteringen av formulärsändningsstatus. Denna guide ger en omfattande översikt över useFormStatus, utforskar dess funktioner, användningsfall och bästa praxis för att bygga tillgängliga och engagerande formulär för en global publik.

Vad är React useFormStatus?

useFormStatus är en React-hook som ger information om sändningsstatusen för ett formulär. Den är utformad för att fungera sömlöst med server actions, en funktion som låter dig exekvera server-side-logik direkt från dina React-komponenter. Hooken returnerar ett objekt som innehåller information om formulärets väntande status, data och eventuella fel som uppstod under sändningen. Denna information låter dig ge realtidsfeedback till användare, som att visa laddningsindikatorer, inaktivera formulärelement och visa felmeddelanden.

Förstå Server Actions

Innan vi dyker in i useFormStatus är det viktigt att förstå server actions. Server actions är asynkrona funktioner som körs på servern och kan anropas direkt från React-komponenter. De definieras med direktivet 'use server' högst upp i filen. Server actions används vanligtvis för uppgifter som:

Här är ett enkelt exempel på en server action:

// actions.js
'use server';

export async function submitForm(formData) {
  // Simulera en fördröjning för att efterlikna en serverförfrågan
  await new Promise(resolve => setTimeout(resolve, 2000));

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

  if (!name || !email) {
    return { message: 'Vänligen fyll i alla fält.' };
  }

  // Simulera en lyckad sändning
  return { message: `Formuläret har skickats för ${name}!` };
}

Denna action tar emot formulärdata som indata, simulerar en fördröjning och returnerar sedan ett framgångs- eller felmeddelande. Direktivet 'use server' talar om för React att denna funktion ska exekveras på servern.

Hur useFormStatus fungerar

Hooken useFormStatus används inuti en komponent som renderar ett formulär. Den måste användas inuti ett <form>-element som använder `action`-propen med den importerade Server Action. Hooken returnerar ett objekt med följande egenskaper:

Här är ett exempel på hur man använder 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">Namn:</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 ? 'Skickar...' : 'Skicka'}
      </button>
      {error && <p style={{ color: 'red' }}>Fel: {error.message}</p>}
      {data && data.message && <p style={{ color: 'green' }}>{data.message}</p>}
    </form>
  );
}

export default MyForm;

I detta exempel:

Fördelar med att använda useFormStatus

useFormStatus erbjuder flera fördelar för att hantera formulärsändningsstatus:

Bästa praxis för att använda useFormStatus

För att maximera fördelarna med useFormStatus, överväg följande bästa praxis:

Användningsfall för useFormStatus

useFormStatus är tillämpligt i en mängd olika scenarier:

Att hantera internationalisering (i18n)

När man bygger formulär för en global publik är internationalisering (i18n) avgörande. Så här hanterar du i18n när du använder useFormStatus:

Exempel 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 skyddar redan mot 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;

Tillgänglighetsaspekter

Att säkerställa tillgänglighet är av yttersta vikt när man bygger formulär. Så här gör du dina formulär mer tillgängliga när du använder useFormStatus:

Exempel med ARIA-attribut:

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

  return (
    <form action={submitForm}>
      <label htmlFor="name">Namn:</label>
      <input
        type="text"
        id="name"
        name="name"
        disabled={pending}
        aria-invalid={!!error} // Indikera om det finns ett fel
        aria-describedby={error ? 'name-error' : null} // Associera felmeddelande
      />
      {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 ? 'Skickar...' : 'Skicka'}
      </button>
      {data && data.message && <p style={{ color: 'green' }}>{data.message}</p>}
    </form>
  );
}

Utöver grundläggande användning: Avancerade tekniker

Även om den grundläggande användningen av useFormStatus är enkel, finns det flera avancerade tekniker som kan förbättra din formulärsändningsupplevelse ytterligare:

Felsökning av vanliga problem

När du använder useFormStatus kan du stöta på några vanliga problem. Här är hur du felsöker dem:

Alternativ till useFormStatus

Även om useFormStatus är ett kraftfullt verktyg, finns det alternativa metoder för att hantera formulärsändningsstatus, särskilt i äldre React-versioner eller när man hanterar komplex formulärlogik:

Valet av tillvägagångssätt beror på komplexiteten i ditt formulär och dina specifika krav. För enkla formulär är useFormStatus ofta den mest direkta och effektiva lösningen. För mer komplexa formulär kan ett formulärbibliotek eller en global state-hanteringslösning vara mer lämpligt.

Slutsats

useFormStatus är ett värdefullt tillskott till Reacts ekosystem, som förenklar hanteringen av formulärsändningsstatus och gör det möjligt för utvecklare att skapa mer engagerande och informativa användarupplevelser. Genom att förstå dess funktioner, bästa praxis och användningsfall kan du utnyttja useFormStatus för att bygga tillgängliga, internationaliserade och prestandaoptimerade formulär för en global publik. Att anamma useFormStatus effektiviserar utvecklingen, förbättrar användarinteraktionen och bidrar i slutändan till mer robusta och användarvänliga webbapplikationer.

Kom ihåg att prioritera tillgänglighet, internationalisering och prestanda när du bygger formulär för en global publik. Genom att följa de bästa metoderna som beskrivs i den här guiden kan du skapa formulär som är användbara för alla, oavsett deras plats eller förmågor. Detta tillvägagångssätt bidrar till en mer inkluderande och tillgänglig webb för alla användare.

React useFormStatus: Bemästra formulärsändningsstatus för sömlösa användarupplevelser | MLOG