Лучший способ обработки данных вашей формы при использовании Material-UI

В предыдущей статье я показал вам, как создать базовую страницу регистрации с помощью React и Material-UI. В этой статье мы использовали управляемые компоненты и ловушку useState для отслеживания входных значений формы. Вы можете ознакомиться с этой статьей ниже.



В другой статье мы рассмотрели библиотеку под названием React Hook Form. Мы узнали простой способ обработки входных данных в базовой форме с помощью библиотеки.



В этой статье мы объединим наши знания о двух. Мы будем использовать React Hook Form для обработки данных для формы, которая использует компоненты Material-UI. Это делается немного иначе, чем при использовании обычных HTML-тегов <input>.

Эта статья выходит в идеальное время, поскольку только что была выпущена 7-я версия React Hook Form. Посетите их сайт здесь.

Краткое резюме

Если вы пропустили предыдущую статью, давайте подведем итоги. Мы создали базовую страницу регистрации с использованием Material-UI, которая выглядит следующим образом. Эта форма использует компоненты TextField и Button из Material-UI.

В настоящее время мы обрабатываем входные данные формы как управляемый ввод с помощью хука useState от React. Вот пример поля ввода «Имя».

В компоненте TextField мы устанавливаем значение как значение firstName, и мы обновляем значение с помощью свойства onChange.

const [firstName, setFirstName] = useState('');
<TextField
  label="First Name"
  variant="filled"
  required
  value={firstName}
  onChange={e => setFirstName(e.target.value)}
/>

Использование формы React Hook

Вместо этого мы можем использовать компонент-оболочку Controller для интеграции React Hook Form с компонентами Material-UI.

Форма React Hook описывается как «Эффективные, гибкие и расширяемые формы с простой в использовании проверкой».

Давайте сначала установим библиотеку в наш проект.

npm install react-hook-form

Нам нужно будет импортировать ловушку useForm и компонент Controller из библиотеки.

import { useForm, Controller } from "react-hook-form";

Из хука useForm нам нужно будет получить объекты handleSubmit и control.

const { handleSubmit, control } = useForm();

Компонент контроллера

Компонент Контроллер - это компонент-оболочка, который упрощает использование React Hook Form с Material-UI. В качестве примера создадим поле ввода Имя.

Компонент Controller принимает имя, элемент управления, значение по умолчанию, правила и свойства рендеринга.

<Controller
  name="First Name"
  control={control}
  defaultValue=""
  rules={{ required: 'First name required' }}
  // render to be explained in next section 
/>

name - это будет имя ввода, которое будет использоваться при отправке формы.

control - мы передадим объект управления, который мы получили от хука useForm. Это зарегистрирует этот ввод для использования с формой React Hook.

defaultValue - используется как значение по умолчанию для ввода формы.

rules - объект, в котором мы можем указать правила проверки для ввода. Вы можете увидеть список правил, которые вы можете применить здесь. Например, мы можем сделать ввод обязательным и установить сообщение об ошибке, используя rules={{ required: 'First name required ' }}.

Рендеринг опоры

Последняя опора, которую мы добавим, - это опора рендеринга. Это опора, которая принимает функцию, возвращающую элемент React.

В опоре рендеринга мы получим свойства onChange и value из объекта field. Затем мы добавим компонент TextField из Material-UI в качестве возвращаемого значения.

В компоненте TextField мы можем добавить обычные реквизиты, как обычно. В нашем примере добавим label="First Name" и variant="filled". Для свойств value и onChange мы передадим объекты, полученные из свойства field.

Первое вводимое имя будет выглядеть примерно так.

<Controller
  name="firstName"
  control={control}
  defaultValue=""
  rules={{ required: 'First name required' }}
  render={({ field: { onChange, value } }) => (
    <TextField
      label="First Name"
      variant="filled"
      value={value}
      onChange={onChange}
    />
  )}
/>

Добавление проверки

Мы всегда хотим, чтобы наши формы проверялись на стороне клиента.

В функции рендеринга мы также можем получить опору error от объекта fieldState. Этот объект ошибки будет специфическим для входных данных и будет взят из свойства rules, которое мы написали ранее.

Чтобы наша форма выглядела хорошо, мы можем интегрировать некоторые свойства из компонента TextField.

Во-первых, мы добавим опору ошибки. Это свойство должно быть логическим значением, поэтому мы можем использовать error={!!error}, чтобы вернуть истину или ложь в зависимости от того, имеет ли ошибка значение.

Затем мы добавим сообщение об ошибке проверки в качестве вспомогательного текста к компоненту, например, helperText={error ? error.message : null}.

Теперь, если мы попытаемся отправить нашу форму без имени, мы увидим следующую ошибку.

Завершение формы

Чтобы завершить нашу форму, мы можем сделать то же самое для ввода фамилии, адреса электронной почты и пароля. Во вводе электронной почты мы также можем добавить type="email" в качестве опоры к компоненту TextField, чтобы добавить еще один уровень проверки. Во вводе пароля мы можем добавить type="password", чтобы скрыть символы.

Обработка события отправки выполняется так же, как и в предыдущей статье. Все, что вам нужно сделать, это создать функцию onSubmit, которая получает данные из входов, в которые мы добавили контрольное значение. Затем добавьте onSubmit слушателя в форму и используйте функцию handleSubmit из React Hook Form и передайте функцию onSubmit в качестве аргумента.

В нашем примере мы просто запишем данные формы в консоль.

Заключение

Окончательный файл Form.js будет выглядеть примерно так.

Спасибо за прочтение! Если вы хотите ознакомиться с полным исходным кодом этого проекта, посетите репозиторий GitHub здесь. Обязательно посмотрите ветку response-hook-form, чтобы увидеть код для этой статьи.