Български

Потопете се в useFormState на React, за да оптимизирате управлението на форми, да подобрите производителността и потребителското изживяване. Научете най-добри практики и техники.

React useFormState: Овладяване на управлението на форми за оптимизирано потребителско изживяване

Формите са основна част от уеб приложенията, позволявайки на потребителите да взаимодействат с вашето приложение и да изпращат данни. Управлението на състоянието на формата, валидацията и предоставянето на обратна връзка обаче може да стане сложно, особено в големи и динамични приложения. Хукът useFormState на React, въведен в React 18, предлага мощен и ефективен начин за управление на състоянието на формите и оптимизиране на логиката за обработка, което води до подобрена производителност и по-добро потребителско изживяване. Това подробно ръководство изследва хука useFormState в дълбочина, като обхваща основните му концепции, предимства, практически примери и напреднали техники.

Какво е React useFormState?

useFormState е хук в React, който опростява управлението на състоянието на формите, като капсулира логиката за състоянието и актуализацията в един хук. Той е специално проектиран да работи съвместно с React Server Components и Server Actions, позволявайки прогресивно подобрение и по-висока производителност чрез прехвърляне на обработката на формата към сървъра.

Основни характеристики и предимства:

Разбиране на хука useFormState

Хукът useFormState приема два аргумента:

  1. Сървърното действие (The Server Action): Функция, която ще бъде изпълнена при изпращане на формата. Тази функция обикновено се занимава с валидация на формата, обработка на данни и актуализации на базата данни.
  2. Началното състояние (The Initial State): Първоначалната стойност на състоянието на формата. Това може да бъде всяка JavaScript стойност, като обект, масив или примитив.

Хукът връща масив, съдържащ две стойности:

  1. Състоянието на формата (The Form State): Текущата стойност на състоянието на формата.
  2. Действието на формата (The Form Action): Функция, която предавате на пропса action на елемента form. Тази функция задейства сървърното действие, когато формата бъде изпратена.

Основен пример:

Нека разгледаме прост пример с форма за контакт, която позволява на потребителите да изпратят своето име и имейл адрес.

// Сървърно действие (пример - трябва да се дефинира другаде)
async function submitContactForm(prevState, formData) {
  // Валидиране на данните от формата
  const name = formData.get('name');
  const email = formData.get('email');

  if (!name || !email) {
    return { message: 'Моля, попълнете всички полета.' };
  }

  // Обработка на данните от формата (напр. изпращане на имейл)
  try {
    // Симулиране на изпращане на имейл
    await new Promise(resolve => setTimeout(resolve, 1000)); // Симулиране на асинхронна операция
    return { message: 'Благодарим ви за изпратената информация!' };
  } catch (error) {
    return { message: 'Възникна грешка. Моля, опитайте отново по-късно.' };
  }
}

// React компонент
'use client'; // Важно за Server Actions

import { useFormState } from 'react-dom';

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

  return (
    




{state?.message &&

{state.message}

}
); } export default ContactForm;

В този пример функцията submitContactForm е сървърното действие. Тя получава предишното състояние и данните от формата като аргументи. Валидира данните от формата и, ако са валидни, ги обработва и връща нов обект на състоянието със съобщение за успех. Ако има грешки, връща нов обект на състоянието със съобщение за грешка. Хукът useFormState управлява състоянието на формата и предоставя функцията formAction, която се предава на пропса action на елемента form. Когато формата бъде изпратена, функцията submitContactForm се изпълнява на сървъра, а полученото състояние се актуализира в компонента.

Напреднали техники с useFormState

1. Валидация на форми:

Валидацията на формите е от решаващо значение за гарантиране на целостта на данните и осигуряване на добро потребителско изживяване. useFormState може да се използва за обработка на логиката за валидация на форми на сървъра. Ето един пример:

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

  let errors = {};

  if (!name) {
    errors.name = 'Името е задължително.';
  }

  if (!email) {
    errors.email = 'Имейлът е задължителен.';
  } else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) {
    errors.email = 'Невалиден имейл формат.';
  }

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

  // Обработка на данните от формата (напр. запазване в база данни)
  return { message: 'Формата е изпратена успешно!', 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}

}
); }

В този пример сървърното действие validateForm валидира данните от формата и връща обект, съдържащ всички грешки при валидацията. След това компонентът показва тези грешки на потребителя.

2. Оптимистични актуализации:

Оптимистичните актуализации могат да подобрят потребителското изживяване, като предоставят незабавна обратна връзка, дори преди сървърът да е обработил изпращането на формата. С useFormState и малко логика от страна на клиента можете да реализирате оптимистични актуализации, като актуализирате състоянието на формата веднага след нейното изпращане и след това върнете промените, ако сървърът върне грешка.

'use client'

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

async function submitForm(prevState, formData) {
  await new Promise(resolve => setTimeout(resolve, 1000)); // Симулиране на мрежово забавяне

  const value = formData.get('value');
  if (value === 'error') {
    return { message: 'Изпращането неуспешно!' };
  }
  return { message: 'Изпращането успешно!' };
}

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 === 'Изпращането неуспешно!') {
      setOptimisticValue(''); // Връщане при грешка
    }
  };

  return (
    


{state?.message &&

{state.message}

}
); }

В този пример симулираме забавен отговор от сървъра. Преди сървърното действие да приключи, полето за въвеждане се актуализира оптимистично с изпратената стойност. Ако сървърното действие се провали (симулирано чрез изпращане на стойността 'error'), полето за въвеждане се връща в предишното си състояние.

3. Обработка на качване на файлове:

useFormState може да се използва и за обработка на качване на файлове. Обектът FormData автоматично обработва данните на файла. Ето един пример:

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

  if (!file) {
    return { message: 'Моля, изберете файл.' };
  }

  // Симулиране на качване на файла
  await new Promise(resolve => setTimeout(resolve, 1000));

  // Тук обикновено бихте качили файла на сървър
  console.log('Файлът е качен:', file.name);

  return { message: `Файлът ${file.name} е качен успешно!` };
}

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

  return (
    


{state?.message &&

{state.message}

}
); }

В този пример сървърното действие uploadFile извлича файла от обекта FormData и го обработва. В реално приложение обикновено бихте качили файла в услуга за облачно съхранение като Amazon S3 или Google Cloud Storage.

4. Прогресивно подобрение:

Едно от значителните предимства на useFormState и Server Actions е възможността за прогресивно подобрение. Това означава, че вашите форми могат да функционират, дори ако JavaScript е деактивиран в браузъра на потребителя. Формата ще бъде изпратена директно на сървъра, а сървърното действие ще обработи изпращането. Когато JavaScript е активиран, React ще подобри формата с интерактивност и валидация от страна на клиента.

За да осигурите прогресивно подобрение, трябва да се уверите, че вашите сървърни действия обработват цялата логика за валидация на формата и обработка на данни. Можете също така да предоставите резервни механизми за потребители без JavaScript.

5. Съображения за достъпност:

Когато създавате форми, е важно да вземете предвид достъпността, за да се уверите, че потребителите с увреждания могат да използват вашите форми ефективно. useFormState може да ви помогне да създадете достъпни форми, като предоставя механизми за обработка на грешки и обратна връзка към потребителите. Ето някои най-добри практики за достъпност:

Най-добри практики за използване на useFormState

За да се възползвате максимално от хука useFormState, вземете предвид следните най-добри практики:

Примери от реалния свят и случаи на употреба

useFormState може да се използва в голямо разнообразие от реални приложения. Ето няколко примера:

Например, разгледайте форма за завършване на поръчка в електронната търговия. С помощта на useFormState можете да обработвате валидацията на адреси за доставка, информация за плащане и други детайли по поръчката на сървъра. Това гарантира, че данните са валидни, преди да бъдат изпратени към базата данни, а също така подобрява производителността чрез намаляване на обработката от страна на клиента.

Друг пример е форма за регистрация на потребител. С useFormState можете да обработвате валидацията на потребителски имена, пароли и имейл адреси на сървъра. Това гарантира, че данните са сигурни и че потребителят е удостоверен правилно.

Заключение

Хукът useFormState на React предоставя мощен и ефективен начин за управление на състоянието на формите и оптимизиране на логиката за тяхната обработка. Като използва Server Actions и прогресивно подобрение, useFormState ви позволява да създавате здрави, производителни и достъпни форми, които предоставят отлично потребителско изживяване. Следвайки най-добрите практики, описани в това ръководство, можете ефективно да използвате useFormState, за да опростите логиката си за обработка на форми и да създавате по-добри React приложения. Не забравяйте да вземете предвид глобалните стандарти за достъпност и очакванията на потребителите, когато проектирате форми за разнообразна, международна аудитория.

React useFormState: Овладяване на управлението на форми за оптимизирано потребителско изживяване | MLOG