Polski

Odkryj hook useFormState w React, aby usprawnić obsługę formularzy, poprawić wydajność i doświadczenia użytkownika. Poznaj najlepsze praktyki i zaawansowane techniki tworzenia solidnych i wydajnych formularzy.

React useFormState: Opanowanie obsługi formularzy w celu optymalizacji doświadczeń użytkownika

Formularze są fundamentalną częścią aplikacji internetowych, umożliwiając użytkownikom interakcję z aplikacją i przesyłanie danych. Jednak zarządzanie stanem formularza, obsługa walidacji i dostarczanie informacji zwrotnej może stać się skomplikowane, zwłaszcza w dużych i dynamicznych aplikacjach. Hook useFormState w React, wprowadzony w React 18, oferuje potężny i wydajny sposób na zarządzanie stanem formularza i usprawnienie logiki jego obsługi, co prowadzi do poprawy wydajności i lepszych doświadczeń użytkownika. Ten kompleksowy przewodnik dogłębnie omawia hook useFormState, obejmując jego podstawowe koncepcje, korzyści, praktyczne przykłady i zaawansowane techniki.

Czym jest React useFormState?

useFormState to hook Reacta, który upraszcza zarządzanie stanem formularza poprzez enkapsulację stanu i logiki aktualizacji w jednym hooku. Jest on specjalnie zaprojektowany do współpracy z Komponentami Serwerowymi React (React Server Components) i Akcjami Serwerowymi (Server Actions), umożliwiając stopniowe ulepszanie (progressive enhancement) i poprawę wydajności poprzez przeniesienie przetwarzania formularza na serwer.

Kluczowe cechy i korzyści:

Zrozumienie hooka useFormState

Hook useFormState przyjmuje dwa argumenty:

  1. Akcja Serwerowa: Funkcja, która zostanie wykonana po przesłaniu formularza. Ta funkcja zazwyczaj obsługuje walidację formularza, przetwarzanie danych i aktualizacje w bazie danych.
  2. Stan Początkowy: Początkowa wartość stanu formularza. Może to być dowolna wartość JavaScript, taka jak obiekt, tablica lub typ prosty.

Hook zwraca tablicę zawierającą dwie wartości:

  1. Stan Formularza: Bieżąca wartość stanu formularza.
  2. Akcja Formularza: Funkcja, którą przekazujesz do atrybutu action elementu form. Ta funkcja wywołuje akcję serwerową po przesłaniu formularza.

Podstawowy przykład:

Rozważmy prosty przykład formularza kontaktowego, który pozwala użytkownikom na podanie swojego imienia i adresu e-mail.

// Akcja Serwerowa (przykład - musi być zdefiniowana gdzie indziej)
async function submitContactForm(prevState, formData) {
  // Walidacja danych formularza
  const name = formData.get('name');
  const email = formData.get('email');

  if (!name || !email) {
    return { message: 'Proszę wypełnić wszystkie pola.' };
  }

  // Przetwarzanie danych formularza (np. wysłanie e-maila)
  try {
    // Symulacja wysyłania e-maila
    await new Promise(resolve => setTimeout(resolve, 1000)); // Symulacja operacji asynchronicznej
    return { message: 'Dziękujemy za przesłanie zgłoszenia!' };
  } catch (error) {
    return { message: 'Wystąpił błąd. Proszę spróbować ponownie później.' };
  }
}

// Komponent React
'use client'; // Ważne dla Akcji Serwerowych

import { useFormState } from 'react-dom';

function ContactForm() {
  const [state, formAction] = useFormState(submitContactForm, { message: null });

  return (
    




{state?.message &&

{state.message}

}
); } export default ContactForm;

W tym przykładzie funkcja submitContactForm jest akcją serwerową. Otrzymuje ona poprzedni stan oraz dane formularza jako argumenty. Waliduje dane formularza i, jeśli są poprawne, przetwarza je i zwraca nowy obiekt stanu z komunikatem o sukcesie. Jeśli wystąpią błędy, zwraca nowy obiekt stanu z komunikatem o błędzie. Hook useFormState zarządza stanem formularza i dostarcza funkcję formAction, która jest przekazywana do atrybutu action elementu form. Po przesłaniu formularza funkcja submitContactForm jest wykonywana na serwerze, a wynikowy stan jest aktualizowany w komponencie.

Zaawansowane techniki użycia useFormState

1. Walidacja formularza:

Walidacja formularza jest kluczowa dla zapewnienia integralności danych i dobrego doświadczenia użytkownika. useFormState może być używany do obsługi logiki walidacji formularza na serwerze. Oto przykład:

async function validateForm(prevState, formData) {
  const name = formData.get('name');
  const email = formData.get('email');

  let errors = {};

  if (!name) {
    errors.name = 'Imię jest wymagane.';
  }

  if (!email) {
    errors.email = 'Email jest wymagany.';
  } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
    errors.email = 'Nieprawidłowy format adresu e-mail.';
  }

  if (Object.keys(errors).length > 0) {
    return { errors: errors };
  }

  // Przetwarzanie danych formularza (np. zapis do bazy danych)
  return { message: 'Formularz przesłany pomyślnie!', errors: null };
}

function MyForm() {
  const [state, action] = useFormState(validateForm, { message: null, errors: null });

  return (
    

{state?.errors?.name &&

{state.errors.name}

}
{state?.errors?.email &&

{state.errors.email}

} {state?.message &&

{state.message}

}
); }

W tym przykładzie akcja serwerowa validateForm waliduje dane formularza i zwraca obiekt zawierający ewentualne błędy walidacji. Komponent następnie wyświetla te błędy użytkownikowi.

2. Optymistyczne aktualizacje:

Optymistyczne aktualizacje mogą poprawić doświadczenie użytkownika, zapewniając natychmiastową informację zwrotną, nawet zanim serwer przetworzy zgłoszenie formularza. Dzięki useFormState i odrobinie logiki po stronie klienta można zaimplementować optymistyczne aktualizacje, aktualizując stan formularza natychmiast po jego przesłaniu, a następnie cofając aktualizację, jeśli serwer zwróci błąd.

'use client'

import { useFormState } from 'react-dom';
import { useState } from 'react';

async function submitForm(prevState, formData) {
  await new Promise(resolve => setTimeout(resolve, 1000)); // Symulacja opóźnienia sieciowego

  const value = formData.get('value');
  if (value === 'error') {
    return { message: 'Przesyłanie nie powiodło się!' };
  }
  return { message: 'Przesyłanie udane!' };
}

function OptimisticForm() {
  const [optimisticValue, setOptimisticValue] = useState('');
  const [isSubmitting, setIsSubmitting] = useState(false);
  const [state, action] = useFormState(submitForm, { message: '' });

  const handleSubmit = async (e) => {
    setIsSubmitting(true);
    setOptimisticValue(e.target.value.value);
    const formData = new FormData(e.target);
    const result = await action(prevState, formData);
    setIsSubmitting(false);

    if (result?.message === 'Przesyłanie nie powiodło się!') {
      setOptimisticValue(''); // Wycofaj w przypadku błędu
    }
  };

  return (
    


{state?.message &&

{state.message}

}
); }

W tym przykładzie symulujemy opóźnioną odpowiedź serwera. Zanim akcja serwerowa zostanie zakończona, pole wejściowe jest optymistycznie aktualizowane o przesłaną wartość. Jeśli akcja serwerowa zakończy się niepowodzeniem (symulowane przez przesłanie wartości 'error'), pole wejściowe jest przywracane do poprzedniego stanu.

3. Obsługa przesyłania plików:

useFormState może być również używany do obsługi przesyłania plików. Obiekt FormData automatycznie obsługuje dane plików. Oto przykład:

async function uploadFile(prevState, formData) {
  const file = formData.get('file');

  if (!file) {
    return { message: 'Proszę wybrać plik.' };
  }

  // Symulacja przesyłania pliku
  await new Promise(resolve => setTimeout(resolve, 1000));

  // Tutaj zazwyczaj przesyłałbyś plik na serwer
  console.log('Plik przesłany:', file.name);

  return { message: `Plik ${file.name} został pomyślnie przesłany!` };
}

function FileUploadForm() {
  const [state, action] = useFormState(uploadFile, { message: null });

  return (
    


{state?.message &&

{state.message}

}
); }

W tym przykładzie akcja serwerowa uploadFile pobiera plik z obiektu FormData i go przetwarza. W rzeczywistej aplikacji zazwyczaj przesyłałbyś plik do usługi przechowywania w chmurze, takiej jak Amazon S3 lub Google Cloud Storage.

4. Stopniowe ulepszanie (Progressive Enhancement):

Jedną z istotnych zalet useFormState i Akcji Serwerowych jest możliwość zapewnienia stopniowego ulepszania. Oznacza to, że Twoje formularze mogą nadal działać, nawet jeśli JavaScript jest wyłączony w przeglądarce użytkownika. Formularz zostanie przesłany bezpośrednio na serwer, a akcja serwerowa zajmie się jego obsługą. Gdy JavaScript jest włączony, React wzbogaci formularz o interaktywność i walidację po stronie klienta.

Aby zapewnić stopniowe ulepszanie, należy upewnić się, że akcje serwerowe obsługują całą logikę walidacji formularza i przetwarzania danych. Można również zapewnić mechanizmy zastępcze dla użytkowników bez JavaScriptu.

5. Kwestie dostępności:

Podczas tworzenia formularzy ważne jest, aby wziąć pod uwagę dostępność, aby zapewnić, że użytkownicy z niepełnosprawnościami mogą skutecznie z nich korzystać. useFormState może pomóc w tworzeniu dostępnych formularzy, dostarczając mechanizmów do obsługi błędów i przekazywania informacji zwrotnej użytkownikom. Oto kilka najlepszych praktyk w zakresie dostępności:

Najlepsze praktyki użycia useFormState

Aby w pełni wykorzystać możliwości hooka useFormState, rozważ następujące najlepsze praktyki:

Przykłady i przypadki użycia w świecie rzeczywistym

useFormState może być używany w szerokiej gamie rzeczywistych aplikacji. Oto kilka przykładów:

Na przykład, rozważ formularz zamówienia w sklepie internetowym. Używając useFormState, możesz obsłużyć walidację adresów wysyłkowych, informacji o płatności i innych szczegółów zamówienia na serwerze. Zapewnia to, że dane są prawidłowe przed ich przesłaniem do bazy danych, a także poprawia wydajność poprzez zmniejszenie przetwarzania po stronie klienta.

Innym przykładem jest formularz rejestracji użytkownika. Używając useFormState, możesz obsłużyć walidację nazw użytkowników, haseł i adresów e-mail na serwerze. Zapewnia to, że dane są bezpieczne, a użytkownik jest prawidłowo uwierzytelniony.

Podsumowanie

Hook useFormState w React zapewnia potężny i wydajny sposób na zarządzanie stanem formularza i usprawnienie logiki jego obsługi. Wykorzystując Akcje Serwerowe i stopniowe ulepszanie, useFormState pozwala na budowanie solidnych, wydajnych i dostępnych formularzy, które zapewniają doskonałe doświadczenie użytkownika. Postępując zgodnie z najlepszymi praktykami opisanymi w tym przewodniku, możesz skutecznie używać useFormState do uproszczenia logiki obsługi formularzy i tworzenia lepszych aplikacji React. Pamiętaj, aby przy projektowaniu formularzy dla zróżnicowanej, międzynarodowej publiczności brać pod uwagę globalne standardy dostępności i oczekiwania użytkowników.