Итак, в последней статье я объяснил, как создать простую форму с помощью Formik, в этой статье я хочу поговорить о том, как проверять с помощью Yup и отображать ошибки в вашей форме.

Пользовательская проверка

В коде последней статьи вы можете увидеть, как мы обычно проводим проверку:

const validate = values => {
    const errors = {};
    if (!values.firstName) {
      errors.firstName = "Required";
    }    if (!values.lastName) {
      errors.lastName = "Required";
    }    
    return errors;
  };
<Formik
        initialValues={formData}
        validate={validate}
 >
    // put a form here
 </Formik>

Основная идея состоит в том, что в Formik есть свойство validate. Мы можем передать ему метод проверки, который будет принимать values, вводимые пользователем, и проверять его с помощью ваших пользовательских методов. В конце будет возвращено errors, и его можно будет использовать для отображения errors сообщений.

Однако очень часто нам нужно использовать одну и ту же проверку для разных приложений. Например, если мы хотим проверить, что имя пользователя представлено в другом приложении, мы должны перейти в наше последнее приложение и скопировать туда коды или снова написать все это вручную. Это раздражает и очень подвержено ошибкам! Вот где Yup - удобный инструмент.

Да проверка

Схема

Ага, очень полезно, потому что включает в себя много общих проверок. Сначала мы можем установить его:

npm install yup

И затем импортируйте его в документ, который нам нужен для проверки, например:

import * as Yup from 'yup';

После этого мы можем свободно использовать все так:

Yup.<data type>.<built-in method>

Например, чтобы проверить, является ли строка допустимым форматом электронной почты, сделайте следующее:

email: Yup.string.email()

Это проверит поле email, чтобы убедиться, что это действительный адрес электронной почты.

Чтобы проверить весь объект, мы можем сделать это:

let schema = yup.object().shape({
  firstName: yup.string().required(),
  lastName: yup.string().required(),
  }),
});

Это означает, что schema - это метод проверки всего объекта, только когда все поля соответствуют всем требованиям, проверка будет пройдена.

ValidationSchema

Хорошо, а как использовать эту схему для проверки? На самом деле, Formik настолько любит Yup, что предлагает простой способ использовать этот schema: передать его в опору validationSchema в <Formik> следующим образом:

<Formik
        initialValues={formData}
        onSubmit={handleSubmit}
        validationSchema={schema}
>
  //Put the form here
</Formik>

Итак, прямо сейчас происходит волшебство! Formik будет использовать SignupSchema для проверки всех полей в форме. И если есть какие-либо недопустимые элементы, возвращенный объект errors будет содержать имя поля и сообщение, подобное этому:

name: "A name is required."

Я настроил это сообщение, передав его методу require в: Yup.string.required(“A name is required.”). Просто ознакомьтесь с документацией, чтобы узнать, как пройти специальный метод проверки.

Отображать сообщения об ошибках

Как получить доступ к сообщениям об ошибках

Как описано в прошлой статье, Formik - это просто компонент React. Следовательно, свойства могут передаваться и передаваться из компонента. Если мы хотим получить доступ к ошибкам, мы можем извлечь их из свойств, которые Formik предлагает своему дочернему компоненту следующим образом:

<Formik
        initialValues={formData}
        onSubmit={handleSubmit}
        validationSchema={schema}
      >
   {({ handleSubmit, handleChange, handleBlur, values, errors, touched }) => (
     <form onSubmit={handleSubmit}>
       <input
         type="text"
         onChange={handleChange}
         onBlur={handleBlur}
         value={values.firstName}
         name="firstName"
       />
       {errors.firstName &&
         <div>
           {errors.firstName}
         </div>}
       <button type="submit">Submit</button>
     </form>
   )}
      </Formik>

Как мы видим, дочерний компонент Formik здесь <form>. handleSubmit, handleChange, handleBlur, values, errors, touched, все переданы <form> компоненту для использования. Таким образом, мы можем получить доступ к errors, который возвращается методом проверки.

Отображать сообщения об ошибках условно

Теперь все выглядит намного лучше! Однако есть еще одна проблема:

errors.firstName &&
         <div>
           {errors.firstName}
         </div>}

Исходя из этого, мы можем сказать, что условием отображения сообщения об ошибке является наличие errors.firstName. Это имеет смысл в случае, когда мы коснулись поля firstName, но ничего не написали - validation не будет работать, потому что это required. Но что делать, если в самом начале, при первой загрузке формы?

Он только что загружен, мы его еще не трогали, поэтому он пустой! И поскольку проверка загружается при загрузке формы, поэтому, если мы console.log ошибку сейчас, мы увидим, что errors.firstName истинно, что приведет к отображению красной ошибки в форме.

Но мы не этого хотим, верно? Мы хотим, чтобы оно отображалось только при касании и наличии ошибки, связанной с этим полем.

Для этого мы можем:

touched.firstName && errors.firstName ? <div>{errors.firstName} : null

В этом случае он будет отображать ошибку, только когда мы коснемся его, И когда возникнет ошибка.

Примечание

Еще одна важная вещь: если вы хотите использовать опору touched, убедитесь, что вы используете handleBlur в каждом поле ввода, которое вы будете использовать touched следующим образом:

{({ handleSubmit, handleChange, handleBlur, values, errors, touched }) => (
     <form onSubmit={handleSubmit}>
       <input
         type="text"
         onChange={handleChange}
         onBlur={handleBlur}     // IMPORTANT!!
         value={values.firstName}
         name="firstName"
       />
       {errors.firstName &&
         <div>
           {errors.firstName}
         </div>}
       <button type="submit">Submit</button>
     </form>
   )}

Вот как он узнает, какое поле было затронуто.

КОНЕЦ

Спасибо за чтение! Теперь форма с проверкой и ошибками отображается правильно. На следующем шаге мы поговорим о том, как реализовать многоступенчатую форму. Оставайтесь на связи!

Ресурсы:

Формик документ

Да документ

Используйте Formik + Yup, чтобы создать многоэтапную форму React. Часть 1: создание простой формы