Hrvatski

Zaronite u Reactov useFormState hook kako biste pojednostavili upravljanje obrascima, poboljšali performanse i unaprijedili korisničko iskustvo. Naučite najbolje prakse i napredne tehnike za izradu robusnih i učinkovitih obrazaca.

React useFormState: Ovladavanje upravljanjem obrascima za optimizirana korisnička iskustva

Obrasci su temeljni dio web aplikacija, omogućujući korisnicima interakciju s vašom aplikacijom i slanje podataka. Međutim, upravljanje stanjem obrasca, rukovanje validacijom i pružanje povratnih informacija može postati složeno, posebno u velikim i dinamičnim aplikacijama. Reactov useFormState hook, uveden u React 18, nudi moćan i učinkovit način za upravljanje stanjem obrasca i pojednostavljenje logike rukovanja obrascima, što dovodi do poboljšanih performansi i boljeg korisničkog iskustva. Ovaj sveobuhvatni vodič detaljno istražuje useFormState hook, pokrivajući njegove temeljne koncepte, prednosti, praktične primjere i napredne tehnike.

Što je React useFormState?

useFormState je React hook koji pojednostavljuje upravljanje stanjem obrasca enkapsuliranjem stanja i logike ažuriranja unutar jednog hooka. Posebno je dizajniran za rad u kombinaciji s React Server Components i Server Actions, omogućujući progresivno poboljšanje i bolje performanse prebacivanjem obrade obrazaca na poslužitelj.

Ključne značajke i prednosti:

Razumijevanje useFormState hooka

Hook useFormState prima dva argumenta:

  1. Poslužiteljska akcija (Server Action): Funkcija koja će se izvršiti kada se obrazac pošalje. Ova funkcija obično rukuje validacijom obrasca, obradom podataka i ažuriranjem baze podataka.
  2. Početno stanje: Početna vrijednost stanja obrasca. To može biti bilo koja JavaScript vrijednost, kao što je objekt, polje ili primitiv.

Hook vraća polje koje sadrži dvije vrijednosti:

  1. Stanje obrasca: Trenutna vrijednost stanja obrasca.
  2. Akcija obrasca: Funkcija koju prosljeđujete action svojstvu form elementa. Ova funkcija pokreće poslužiteljsku akciju kada se obrazac pošalje.

Osnovni primjer:

Uzmimo jednostavan primjer kontaktnog obrasca koji korisnicima omogućuje slanje imena i e-mail adrese.

// Poslužiteljska akcija (primjer - mora biti definirana drugdje)
async function submitContactForm(prevState, formData) {
  // Validacija podataka obrasca
  const name = formData.get('name');
  const email = formData.get('email');

  if (!name || !email) {
    return { message: 'Molimo ispunite sva polja.' };
  }

  // Obrada podataka obrasca (npr. slanje e-pošte)
  try {
    // Simulacija slanja e-pošte
    await new Promise(resolve => setTimeout(resolve, 1000)); // Simulacija asinkrone operacije
    return { message: 'Hvala na vašem podnesku!' };
  } catch (error) {
    return { message: 'Došlo je do pogreške. Molimo pokušajte ponovno kasnije.' };
  }
}

// React komponenta
'use client'; // Važno za poslužiteljske akcije

import { useFormState } from 'react-dom';

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

  return (
    




{state?.message &&

{state.message}

}
); } export default ContactForm;

U ovom primjeru, funkcija submitContactForm je poslužiteljska akcija. Ona prima prethodno stanje i podatke obrasca kao argumente. Validira podatke obrasca i, ako su valjani, obrađuje podatke te vraća novi objekt stanja s porukom o uspjehu. Ako postoje pogreške, vraća novi objekt stanja s porukom o pogrešci. Hook useFormState upravlja stanjem obrasca i pruža funkciju formAction, koja se prosljeđuje action svojstvu form elementa. Kada se obrazac pošalje, funkcija submitContactForm se izvršava na poslužitelju, a rezultirajuće stanje se ažurira u komponenti.

Napredne tehnike korištenja useFormState

1. Validacija obrasca:

Validacija obrasca ključna je za osiguravanje integriteta podataka i pružanje dobrog korisničkog iskustva. useFormState se može koristiti za rukovanje logikom validacije obrasca na poslužitelju. Evo primjera:

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

  let errors = {};

  if (!name) {
    errors.name = 'Ime je obavezno.';
  }

  if (!email) {
    errors.email = 'Email je obavezan.';
  } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
    errors.email = 'Neispravan format emaila.';
  }

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

  // Obrada podataka obrasca (npr. spremanje u bazu podataka)
  return { message: 'Obrazac uspješno poslan!', 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}

}
); }

U ovom primjeru, poslužiteljska akcija validateForm validira podatke obrasca i vraća objekt koji sadrži sve pogreške validacije. Komponenta zatim prikazuje te pogreške korisniku.

2. Optimistična ažuriranja:

Optimistična ažuriranja mogu poboljšati korisničko iskustvo pružanjem trenutnih povratnih informacija, čak i prije nego što poslužitelj obradi slanje obrasca. S useFormState i malo logike na strani klijenta, možete implementirati optimistična ažuriranja tako da odmah ažurirate stanje obrasca nakon slanja, a zatim vratite ažuriranje ako poslužitelj vrati pogrešku.

'use client'

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

async function submitForm(prevState, formData) {
  await new Promise(resolve => setTimeout(resolve, 1000)); // Simulacija mrežne latencije

  const value = formData.get('value');
  if (value === 'error') {
    return { message: 'Slanje nije uspjelo!' };
  }
  return { message: 'Slanje uspješno!' };
}

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 === 'Slanje nije uspjelo!') {
      setOptimisticValue(''); // Vrati na prethodno stanje u slučaju pogreške
    }
  };

  return (
    


{state?.message &&

{state.message}

}
); }

U ovom primjeru simuliramo odgođeni odgovor poslužitelja. Prije nego što se poslužiteljska akcija dovrši, polje za unos se optimistično ažurira poslanom vrijednošću. Ako poslužiteljska akcija ne uspije (simulirano slanjem vrijednosti 'error'), polje za unos se vraća u prethodno stanje.

3. Upravljanje prijenosom datoteka:

useFormState se također može koristiti za upravljanje prijenosom datoteka. Objekt FormData automatski rukuje podacima datoteke. Evo primjera:

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

  if (!file) {
    return { message: 'Molimo odaberite datoteku.' };
  }

  // Simulacija prijenosa datoteke
  await new Promise(resolve => setTimeout(resolve, 1000));

  // Ovdje biste obično prenijeli datoteku na poslužitelj
  console.log('Datoteka prenesena:', file.name);

  return { message: `Datoteka ${file.name} uspješno prenesena!` };
}

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

  return (
    


{state?.message &&

{state.message}

}
); }

U ovom primjeru, poslužiteljska akcija uploadFile dohvaća datoteku iz objekta FormData i obrađuje je. U stvarnoj aplikaciji, obično biste prenijeli datoteku na uslugu za pohranu u oblaku kao što je Amazon S3 ili Google Cloud Storage.

4. Progresivno poboljšanje:

Jedna od značajnih prednosti useFormState i poslužiteljskih akcija je mogućnost pružanja progresivnog poboljšanja. To znači da vaši obrasci mogu i dalje funkcionirati čak i ako je JavaScript onemogućen u korisnikovom pregledniku. Obrazac će se izravno poslati na poslužitelj, a poslužiteljska akcija će obraditi slanje. Kada je JavaScript omogućen, React će poboljšati obrazac interaktivnošću i validacijom na strani klijenta.

Kako biste osigurali progresivno poboljšanje, trebali biste se pobrinuti da vaše poslužiteljske akcije rukuju svom logikom validacije i obrade podataka. Također možete osigurati zamjenske mehanizme za korisnike bez JavaScripta.

5. Razmatranja o pristupačnosti:

Prilikom izrade obrazaca važno je uzeti u obzir pristupačnost kako bi se osiguralo da korisnici s invaliditetom mogu učinkovito koristiti vaše obrasce. useFormState vam može pomoći u stvaranju pristupačnih obrazaca pružanjem mehanizama za rukovanje pogreškama i davanje povratnih informacija korisnicima. Evo nekoliko najboljih praksi za pristupačnost:

Najbolje prakse za korištenje useFormState

Kako biste maksimalno iskoristili useFormState hook, razmotrite sljedeće najbolje prakse:

Primjeri i slučajevi upotrebe iz stvarnog svijeta

useFormState se može koristiti u širokom spektru stvarnih aplikacija. Evo nekoliko primjera:

Na primjer, uzmite u obzir obrazac za naplatu u e-trgovini. Koristeći useFormState, možete rukovati validacijom adresa za dostavu, podataka o plaćanju i drugih detalja narudžbe na poslužitelju. To osigurava da su podaci valjani prije nego što se pošalju u bazu podataka, a također poboljšava performanse smanjenjem obrade na strani klijenta.

Drugi primjer je obrazac za registraciju korisnika. Koristeći useFormState, možete rukovati validacijom korisničkih imena, lozinki i e-mail adresa na poslužitelju. To osigurava da su podaci sigurni i da je korisnik ispravno autentificiran.

Zaključak

Reactov useFormState hook pruža moćan i učinkovit način za upravljanje stanjem obrasca i pojednostavljenje logike rukovanja obrascima. Iskorištavanjem poslužiteljskih akcija i progresivnog poboljšanja, useFormState vam omogućuje izradu robusnih, performantnih i pristupačnih obrazaca koji pružaju izvrsno korisničko iskustvo. Slijedeći najbolje prakse navedene u ovom vodiču, možete učinkovito koristiti useFormState za pojednostavljenje logike rukovanja obrascima i izgradnju boljih React aplikacija. Ne zaboravite uzeti u obzir globalne standarde pristupačnosti i očekivanja korisnika prilikom dizajniranja obrazaca za raznoliku, međunarodnu publiku.