Полное руководство по эффективному использованию и проверке форм в React

Полное руководство по эффективному использованию и проверке форм в React

6 января 2024 г.

Форма — неотъемлемый компонент каждого веб-сайта. Независимо от того, регистрируетесь ли вы на сервисе, входите в свою электронную почту или отправляете сообщения своим друзьям, вам всегда нужна форма для этих действий. Без форм веб-сайты и веб-приложения могли бы быть доступны только для чтения, предлагая только односторонний метод связи, при котором пользователи не могут отправлять сообщения или данные в систему.

В этом руководстве вы узнаете, как создавать и проверять формы в React, гарантируя, что пользователи предоставляют данные в указанном формате.

Кроме того, вы узнаете, как использовать библиотеки схем проверки, такие как Yup и Zod, а также другие библиотеки управления формами, такие как React Hook Form и Формик.

Контролируемые и неконтролируемые формы в React

Управляемая форма — это форма, в которой состояния React управляют и обрабатывают значения формы, что позволяет вам выполнять различные действия или изменять вводимые данные по мере их ввода пользователем.

С другой стороны, в неконтролируемой форме компоненты формы управляют своими значениями. Данные доступны только для чтения, пока пользователь не отправит форму, что делает ее более подходящей для создания простых форм.

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

Пример контролируемой формы

import { useState } from "react";

const App = () => {
    //👇🏻 states for modifying the form inputs
    const [name, setName] = useState("");
    const [email, setEmail] = useState("");
    const [message, setMessage] = useState("");

    //👇🏻 executes when a user submits the form
    const handleSubmit = (event) => {
        event.preventDefault();
        console.log({ name, email, message });        setName("");        setEmail("");        setMessage("");


    };

    return (
        <div>
            <form onSubmit={handleSubmit}>
                <h2>Contact Us</h2>
                <label htmlFor='name'>Name</label>
                <input
                    type='text'
                    id='name'
                    value={name}
                    onChange={(e) => setName(e.target.value)}
                />
                <label htmlFor='email'>Email</label>
                <input
                    type='email'
                    id='email'
                    value={email}
                    onChange={(e) => setEmail(e.target.value)}
                />
                <label htmlFor='message'>Message</label>
                <textarea
                    rows={5}
                    id='message'
                    value={message}
                    onChange={(e) => setMessage(e.target.value)}
                />
                <button type='submit'>SEND</button>
            </form>
        </div>
    );
};

Как видно из приведенного выше фрагмента кода, состояния React управляют и хранят значения формы, что позволяет нам контролировать значения состояния с помощью функции `setState` и выполнять различные действия по мере того, как пользователь вводит входные данные.

Пример неконтролируемой формы

const App = () => {
    //👇🏻 executes when a user submits the form
    const handleSubmit = (event) => {
        event.preventDefault();
        const formData = new FormData(event.target);
        const object = Object.fromEntries(formData);
        console.log(object);
    };
    return (
        <div>
            <form onSubmit={handleSubmit}>
                <h2>Contact Us</h2>
                <label htmlFor='name'>Name</label>
                <input type='text' id='name' name='name' />
                <label htmlFor='email'>Email</label>
                <input type='email' id='email' name='email' />
                <label htmlFor='message'>Message</label>
                <textarea rows={5} id='message' name='message' />
                <button type='submit'>SEND</button>
            </form>
        </div>
    );
};

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

<блок-цитата>

Неконтролируемую форму также можно создать с помощью хука React useRef.

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

import { useRef } from "react";

const App = () => {
    const nameRef = useRef(null);
    const emailRef = useRef(null);
    const messageRef = useRef(null);

    const handleSubmit = (event) => {
        event.preventDefault();
        // Access input values directly using refs
        const name = nameRef.current.value;
        const email = emailRef.current.value;
        const message = messageRef.current.value;
        console.log({ name, email, message });
    };

    return (
        <div>
            <form onSubmit={handleSubmit}>
                <h2>Contact Us</h2>
                <label htmlFor='name'>Name</label>
                <input type='text' id='name' ref={nameRef} />
                <label htmlFor='email'>Email</label>
                <input type='email' id='email' ref={emailRef} />
                <label htmlFor='message'>Message</label>
                <textarea rows={5} id='message' ref={messageRef} />
                <button type='submit'>SEND</button>
            </form>
        </div>
    );
};

Проверка формы в React

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

Чтобы предотвратить это, вам необходимо проверить входные данные формы. В современных приложениях входные данные формы проверяются как на клиентской, так и на серверной стороне приложения. Этот процесс гарантирует, что входные данные имеют желаемый формат, предотвращая обработку вредоносных входных данных или атак приложением.

В React существуют различные способы проверки ввода формы. В следующих разделах вы узнаете о некоторых из этих методов.

Использование атрибутов HTML по умолчанию

Элементы формы HTML предоставляют некоторые атрибуты по умолчанию, которые позволяют нам проверять входные данные формы перед их сохранением в приложении.

Некоторые из них:

  • Обязательный атрибут указывает, что поле ввода должно быть заполнено, прежде чем пользователь сможет отправить форму.
  • Атрибуты minlength и maxlength гарантируют, что вводимые данные формы должны иметь желаемую длину.
  • Атрибут Accept при загрузке файла, указывающий допустимые форматы файлов.

Рассмотрим фрагмент кода ниже:

import { useState } from "react";

const App = () => {
    const [username, setUsername] = useState("");
    const [password, setPassword] = useState("");
    const [email, setEmail] = useState("");

    //👇🏻 executes when a user submits the form
    const handleSubmit = (event) => {
        event.preventDefault();
        console.log({ username, password, email });
        alert("Form Submitted ✅");
    };

    return (
        <div>
            <form onSubmit={handleSubmit}>
                <h2>Log in</h2>
                <label htmlFor='name'>Username</label>
                <input
                    type='text'
                    id='username'
                    name='username'
                    value={username}
                    onChange={(e) => setUsername(e.target.value)}
                    required
                    minLength={6}
                />
                <label htmlFor='email'>Email</label>
                <input
                    type='email'
                    id='email'
                    name='email'
                    value={email}
                    required
                    onChange={(e) => setEmail(e.target.value)}
                />
                <label htmlFor='password'>Password</label>
                <input
                    type='password'
                    id='password'
                    name='password'
                    value={password}
                    required
                    minLength={8}
                    onChange={(e) => setPassword(e.target.value)}
                />
                <button type='submit'>REGISTER</button>
            </form>
        </div>
    );
};

Приведенный выше фрагмент кода гарантирует, что пользователь предоставит имя пользователя, адрес электронной почты и пароль перед отправкой формы.

В форме принимаются имя пользователя длиной не менее шести символов, адрес электронной почты и пароль длиной не менее восьми символов.

React Forms

Использование пользовательских функций JavaScript

Другой метод проверки входных данных формы — создание пользовательских функций JavaScript, которые перед отправкой формы проверяют, имеют ли входные данные желаемый формат.

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

Рассмотрим приведенный ниже фрагмент кода:

import { useState } from "react";

const App = () => {
    //👇🏻 state for each input
    const [username, setUsername] = useState("");
    const [password, setPassword] = useState("");
    const [email, setEmail] = useState("");

    //👇🏻 state for error messages
    const [errorMessage, setErrorMessage] = useState({
        username: "",
        email: "",
        password: "",
    });

    // 👇🏻 Function to update error messages
    const updateErrorState = (fieldName, message) => {
        setErrorMessage((prevState) => ({
            ...prevState,
            [fieldName]: message,
        }));
    };

    //👇🏻 function for validating inputs
    const validateInput = (data) => {
        const { value, name } = data;
        if (name === "username") {
            if (value.trim() === "") {
                updateErrorState(name, "Username is required");
            } else if (value.length < 6) {
                updateErrorState(name, "Username must be at least 6 characters");
            } else {
                updateErrorState(name, "");
            }
        } else if (name === "email") {
            if (value.trim() === "") {
                updateErrorState(name, "Email is required");
            } else {
                updateErrorState(name, "");
            }
        } else {
            if (value.trim() === "") {
                updateErrorState(name, "Password is required");
            } else if (value.length < 8) {
                updateErrorState(name, "Password must be at least 8 characters");
            } else {
                updateErrorState(name, "");
            }
        }
    };

    //👇🏻 submits the form
    const handleSubmit = (e) => {
        e.preventDefault();
        if (
            Object.values(errorMessage).some((message) => message !== "") ||
            !email ||
            !password ||
            !username
        ) {
            alert("Invalid Credentials ❌");
            return;
        }
        alert("Form Submitted ✅");
    };

    return (
        <div>
            <form onSubmit={handleSubmit}>
                <h2>Log in</h2>
                <label htmlFor='name'>Username</label>
                <input
                    type='text'
                    id='username'
                    name='username'
                    value={username}
                    onChange={(e) => {
                        setUsername(e.target.value);
                        validateInput(e.target);
                    }}
                />
                {errorMessage.username && <p>{errorMessage.username}</p>}
                <label htmlFor='email'>Email</label>
                <input
                    type='email'
                    id='email'
                    name='email'
                    value={email}
                    onChange={(e) => {
                        setEmail(e.target.value);
                        validateInput(e.target);
                    }}
                />
                {errorMessage.email && <p>{errorMessage.email}</p>}
                <label htmlFor='password'>Password</label>
                <input
                    type='password'
                    id='password'
                    name='password'
                    value={password}
                    onChange={(e) => {
                        setPassword(e.target.value);
                        validateInput(e.target);
                    }}
                />
                {errorMessage.password && <p>{errorMessage.password}</p>}
                <button type='submit'>REGISTER</button>
            </form>
        </div>
    );
};

Функция validInput гарантирует, что вводимые пользователем данные соответствуют указанным ограничениям перед отправкой формы. В противном случае пользователю будет показано необходимое сообщение об ошибке.

Функция проверяет, что имя пользователя, адрес электронной почты и пароль не пустые, имя пользователя содержит не менее шести символов, а пароль содержит не менее восьми символов.

Form-Validation-in-React

Проверка формы с помощью Yup

Да, это простой валидатор схемы JavaScript который предоставляет несколько функций, позволяющих нам проверить, соответствует ли объект определенному набору правил.

Он предоставляет простой и декларативный способ определения правил проверки и гарантирует, что входные данные формы соответствуют им.

Чтобы проверить формы с помощью Yup, вам необходимо установить пакет, запустив приведенный ниже фрагмент кода:

Затем создайте схему для данных формы. Схема описывает форму, ограничения и тип данных значений, которые необходимо извлечь из формы. Да, проверяет эту схему на соответствие введенным пользователем данным, чтобы гарантировать соблюдение правил, указанных в схеме.

В качестве примера ниже показана схема формы, содержащей адрес электронной почты, имя пользователя длиной не менее шести символов и пароль длиной не менее восьми символов:

Объект userSchema описывает входные данные формы.

Например, имя пользователя является обязательным и должно представлять собой строку длиной не менее шести символов. Строковые аргументы функции — это ошибки, отображаемые, когда входные данные не соответствуют определенному правилу.

Давайте рассмотрим полный код формы:

import { useState } from "react";
import { object, string } from "yup";

const App = () => {
    const [username, setUsername] = useState("");
    const [password, setPassword] = useState("");
    const [email, setEmail] = useState("");
    const [errorMessage, setErrorMessage] = useState({
        username: "",
        email: "",
        password: "",
    });
    //👇🏻 user schema with Yup
    const userSchema = object().shape({
        username: string()
            .required("Username is required")
            .min(6, "Username must be at least 6 characters"),
        email: string().email("Invalid Email").required("Email is required"),
        password: string()
            .required("Password is required")
            .min(8, "Password must be at least 8 characters"),
    });

    //👇🏻 submits the form
    const handleSubmit = async (e) => {
        e.preventDefault();
        try {
            await userSchema.validate(
                { username, email, password },
                { abortEarly: false }
            );
            console.log({ email, username, password });
            setErrorMessage({ username: "", email: "", password: "" });
            alert("Form Submitted ✅");
        } catch (error) {
            //👇🏻 update the  errors
            const errors = error.inner.reduce((accumulator, currentValue) => {
                accumulator[currentValue.path] = currentValue.message;
                return accumulator;
            }, {});
            setErrorMessage(errors);
            return;
        }
    };

    return (
        <div>
            <form onSubmit={handleSubmit}>
                <h2>Log in</h2>
                <label htmlFor='name'>Username</label>
                <input
                    type='text'
                    id='username'
                    name='username'
                    value={username}
                    onChange={(e) => setUsername(e.target.value)}
                />
                {errorMessage.username && <p>{errorMessage.username}</p>}
                <label htmlFor='email'>Email</label>
                <input
                    type='email'
                    id='email'
                    name='email'
                    value={email}
                    onChange={(e) => setEmail(e.target.value)}
                />
                {errorMessage.email && <p>{errorMessage.email}</p>}
                <label htmlFor='password'>Password</label>
                <input
                    type='password'
                    id='password'
                    name='password'
                    value={password}
                    onChange={(e) => setPassword(e.target.value)}
                />
                {errorMessage.password && <p>{errorMessage.password}</p>}
                <button type='submit'>REGISTER</button>
            </form>
        </div>
    );
};

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

React Form- Validation

Проверка формы с помощью Zod

Zod — это библиотека объявления и проверки схемы, основанная на TypeScript. Он позволяет вам определить схему для ввода формы с помощью кратких функций и проверять вводимые пользователем данные на соответствие схеме, как и да.

Вы можете установить Zod, запустив приведенный ниже фрагмент кода:

Создайте схему для ввода формы.

Он описывает входные данные формы и гарантирует, что они соответствуют правилам.

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

Давайте рассмотрим полный код формы:

import { useState } from "react";
import { z, ZodError } from "zod";

const App = () => {
    const [username, setUsername] = useState("");
    const [password, setPassword] = useState("");
    const [email, setEmail] = useState("");
    const [errorMessage, setErrorMessage] = useState({
        username: "",
        email: "",
        password: "",
    });
    //👇🏻 user schema with Zod
    const schema = z.object({
        username: z.string().min(6, {
            message: "Username must be at least 6 characters",
        }),
        email: z.string().email({ message: "Invalid email address" }),
        password: z.string().min(8, {
            message: "Password must be at least 8 characters",
        }),
    });

    //👇🏻 submits the form
    const handleSubmit = (e) => {
        e.preventDefault();
        try {
            //👇🏻 validates the inputs
            schema.parse({ username, email, password });
            console.log({ email, username, password });
            setErrorMessage({ username: "", email: "", password: "" });
            alert("Form Submitted ✅");
        } catch (error) {
            //👇🏻 updates error message
            if (error instanceof ZodError) {
                const newFormErrors = {};
                error.errors.forEach((err) => {
                    const fieldName = err.path[0];
                    newFormErrors[fieldName] = err.message;
                });
                setErrorMessage(newFormErrors);
            }
        }
    };

    return (
        <div>
            <form onSubmit={handleSubmit}>
                <h2>Log in</h2>
                <label htmlFor='name'>Username</label>
                <input
                    type='text'
                    id='username'
                    name='username'
                    value={username}
                    onChange={(e) => setUsername(e.target.value)}
                />
                {errorMessage.username && <p>{errorMessage.username}</p>}
                <label htmlFor='email'>Email</label>
                <input
                    type='email'
                    id='email'
                    name='email'
                    value={email}
                    onChange={(e) => setEmail(e.target.value)}
                />
                {errorMessage.email && <p>{errorMessage.email}</p>}
                <label htmlFor='password'>Password</label>
                <input
                    type='password'
                    id='password'
                    name='password'
                    value={password}
                    onChange={(e) => setPassword(e.target.value)}
                />
                {errorMessage.password && <p>{errorMessage.password}</p>}
                <button type='submit'>REGISTER</button>
            </form>
        </div>
    );
};

Когда пользователь отправляет форму, Zod проверяет входные данные формы и возвращает сообщения об ошибках для недопустимых полей.

Однако вы заметите, что в Yup и Zod проверка происходит, когда пользователь отправляет форму. Как мы можем проверять вводимые пользователем данные?

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

Управление вводом формы с помощью React Hook Form

React Hook Form — популярная библиотека, которая позволяет создавать простые, масштабируемые и высокопроизводительные формы. Он управляет входными данными формы, обеспечивает проверку и при необходимости отображает необходимые ошибки.

React Hook Form также предоставляет несколько функций, таких как инструмент разработчика для мониторинга ввода формы во время разработки, методы проверки HTML, возможность добавления проверки настраиваемых шаблонов и шаблонов регулярных выражений, а также поддержка библиотек проверки схемы, таких как Yup или Zod, что позволяет нам создавайте высокофункциональные и защищенные формы.

Чтобы использовать React Hook Form, установите его пакет, запустив приведенный ниже фрагмент кода.

npm install react-hook-form

Давайте создадим форму регистрации, используя библиотеку React Hook Form:

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

const App = () => {
    const { register, handleSubmit, formState } = useForm();
    const { errors } = formState;

    //👇🏻 submits the form
    const onSubmit = (data) => {
        console.log("Form Submitted", data);
        alert("Form Submitted ✅");
    };

    return (
        <div>
            <form onSubmit={handleSubmit(onSubmit)} noValidate>
                <h2>Log in</h2>
                <label htmlFor='name'>Username</label>
                <input
                    type='text'
                    id='username'
                    {...register("username", {
                        required: "Username is required",
                        minLength: {
                            value: 6,
                            message: "Username must be at least 6 characters",
                        },
                    })}
                />
                <p>{errors.username?.message}</p>
                <label htmlFor='email'>Email</label>
                <input
                    type='email'
                    id='email'
                    {...register("email", {
                        required: "Email is required",
                        pattern: {
                            value: /^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]+$/,
                            message: "Invalid email address",
                        },
                    })}
                />
                <p>{errors.email?.message}</p>
                <label htmlFor='password'>Password</label>
                <input
                    type='password'
                    id='password'
                    {...register("password", {
                        required: "Password is required",
                        minLength: {
                            value: 8,
                            message: "Password must be at least 8 characters",
                        },
                    })}
                />
                <p>{errors.password?.message}</p>
                <button type='submit'>REGISTER</button>
            </form>
        </div>
    );
};

Фрагмент кода использует функции React Hook Form, такие как управление данными формы, проверка формы, отправка формы и отображение ошибок.

* Хук useForm содержит функции, необходимые для управления формой. * Функция handleSubmit обрабатывает отправку формы, а атрибут `novalidate` в элементе формы деактивирует проверку HTML, чтобы предоставить React Hook Form полный контроль над формой. * Функция регистрации регистрирует каждое поле ввода в React Hook Form, что позволяет ей управлять состоянием формы. Функция регистрации принимает два аргумента — имя поля и объект проверки. * Объект formState содержит сообщения об ошибках, связанные с каждым полем ввода.

Controlled vs Uncontrolled-forms-in-React

React Hook Form дает вам полный контроль над вашей формой и позволяет добавлять различные библиотеки проверки схемы для создания высокозащищенных и сложных форм.

В следующих разделах вы узнаете, как добавить Yup и Zod в форму React Hook.

Интеграция Yup с формой React Hook

Вы можете расширить React Hook Form, используя его пакет Resolvers. Он позволяет вам добавить любую библиотеку проверки в форму React Hook. Поэтому установите Yup и пакет Resolvers, выполнив приведенный ниже фрагмент кода.

npm install @hookform/resolvers yup

Создайте схему формы, используя Yup, как показано ниже:

import * as yup from "yup";

const schema = yup
    .object()
    .shape({
        username: yup
            .string()
            .required("Username is required")
            .min(6, "Username must be at least 6 characters"),
        email: yup.string().required("Email is required"),
        password: yup
            .string()
            .required("Password is required")
            .min(8, "Password must be at least 8 characters"),
    })
    .required();

Наконец, добавьте схему в хук useForm, используя преобразователь Yup. Он проверяет входные данные формы и гарантирует их соответствие схеме.

import { yupResolver } from "@hookform/resolvers/yup";

const App = () => {
    const { register, handleSubmit, formState } = useForm({
        resolver: yupResolver(schema),
    });
    const { errors } = formState;

    //👇🏻 submits the form
    const onSubmit = (data) => {
        console.log("Form Submitted", data);
        alert("Form Submitted ✅");
    };

    return (
        <div>
            <form onSubmit={handleSubmit(onSubmit)} noValidate>
                <h2>Log in</h2>

                <label htmlFor='name'>Username</label>
                <input type='text' id='username' {...register("username")} />
                <p>{errors.username?.message}</p>

                <label htmlFor='email'>Email</label>
                <input type='email' id='email' {...register("email")} />
                <p>{errors.email?.message}</p>

                <label htmlFor='password'>Password</label>
                <input type='password' id='password' {...register("password")} />
                <p className='text-red-500 mb-4 '>{errors.password?.message}</p>

                <button type='submit'>REGISTER</button>
            </form>
        </div>
    );
};

React-Forms-Validation

Интеграция Zod с формой React Hook

Вы можете добавить Zod в форму React Hook, используя пакет Resolvers. Установите Zod и пакет Resolvers, запустив приведенный ниже фрагмент кода.

npm install @hookform/resolvers zod

Создайте схему формы с помощью Zod, как показано ниже:

import * as z from "zod";

const schema = z.object({
    username: z.string().min(6, {
        message: "Username must be at least 6 characters",
    }),
    email: z.string().email({ message: "Invalid email address" }),
    password: z.string().min(8, {
        message: "Password must be at least 8 characters",
    }),
});

Наконец, добавьте схему в хук useForm, используя преобразователь Zod. Zod предоставляет необходимую схему для формы, а React Hook Form гарантирует, что предоставленные входные данные соответствуют схеме перед отправкой формы.

Поздравляем! Вы узнали, как создавать гибкие и безопасные формы с помощью React Hook Form, а также научились расширять его для поддержки различных библиотек проверки схемы, таких как Yup и Zod.

Управление вводом формы с помощью Formik

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

Как и React Hook Form, Formik — это гибкая библиотека, которая позволяет расширять ее возможности с помощью библиотек проверки схемы, таких как Yup и Zod.

Запустите приведенный ниже фрагмент кода, чтобы установить Formik

Установить форму npm

Как и хук useForm в React Hook Form, Formik предоставляет хук под названием useFormik. Он обеспечивает проверку данных, обрабатывает отправку форм и управляет вводом пользователя.

Хук useFormik принимает объект, содержащий начальные значения полей формы, функцию onSubmit и функцию проверки.

import { useFormik } from "formik";

const formik = useFormik({
    initialValues: {
        //👇🏻 form default input
        username: "",
        email: "",
        password: "",
    },
    //👇🏻 handles form submission
    onSubmit: (values) => {
        console.log(values);
    },
    //👇🏻 handles form validation
    validate: (values) => {
        //👉🏻 validate form inputs
    },
});

Давайте воссоздадим форму регистрации:

import { useFormik } from "formik";

//👇🏻 form validation function
const validate = (values) => {
    // validate function
    let errors = {};
    if (!values.username) {
        errors.username = "Required";
    } else if (values.username.length < 6) {
        errors.username = "Must be 6 characters or more";
    }

    if (!values.email) {
        errors.email = "Required";
    } else if (!/^[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,}$/i.test(values.email)) {
        errors.email = "Invalid email address";
    }

    if (!values.password) {
        errors.password = "Required";
    } else if (values.password.length < 8) {
        errors.password = "Must be 8 characters or more";
    } else if (values.password === "password") {
        errors.password = "Must not be password";
    }
    return errors;
};

//👇🏻 form submission function
const onSubmit = (values) => {
    console.log(values);
    alert("Form submitted successfully ✅");
};

const App = () => {
    const formik = useFormik({
        initialValues: {
            username: "",
            email: "",
            password: "",
        },
        onSubmit,
        validate,
    });

    return (
        <div>
            <form onSubmit={formik.handleSubmit}>
                <h2>Log in</h2>
                <label htmlFor='name'>Username</label>
                <input
                    type='text'
                    id='username'
                    name='username'
                    {...formik.getFieldProps("username")}
                />
                {formik.touched.username ? <p>{formik.errors.username}</p> : null}

                <label htmlFor='email'>Email</label>
                <input
                    type='email'
                    id='email'
                    name='email'
                    {...formik.getFieldProps("email")}
                />
                {formik.touched.email ? (
                    <p className='text-red-500 mb-4 '>{formik.errors.email}</p>
                ) : null}

                <label htmlFor='password'>Password</label>
                <input
                    type='password'
                    id='password'
                    name='password'
                    {...formik.getFieldProps("password")}
                />
                {formik.touched.password ? <p>{formik.errors.password}</p> : null}

                <button type='submit'>REGISTER</button>
            </form>
        </div>
    )};

Из фрагмента кода выше:

  • Объект InitialValue содержит имя и значение по умолчанию полей ввода в форме.
  • Функция formik.getFieldProps() управляет значениями полей.
  • formik.handleSubmit выполняет функцию onSubmit, зарегистрированную в хуке useFormik.
  • Функция проверки создает объект ошибки, содержащий ограничения или проверки, необходимые в форме. Он отображает сообщения об ошибках, если введенные данные соответствуют правилам проверки.

Интеграция Formik со схемами проверки

Formik позволяет использовать различные библиотеки проверки для создания надежных форм со сложными правилами проверки. Это позволяет нам использовать сильные стороны обеих библиотек для создания масштабируемых и защищенных форм.

Например, вы можете создать схему проверки с помощью Yup и добавить ее в хук useFormik, как показано ниже:

import { object, string } from "yup";

const App = () => {
    //👇🏻 Yup validation schema
    const validationSchema = object().shape({
        username: string()
            .required("Username is required")
            .min(6, "Username must be at least 6 characters"),
        email: string().email("Invalid email").required("Email is required"),
        password: string()
            .required("Password is required")
            .min(8, "Password must be at least 8 characters"),
    });

    //👇🏻 useFormik hook using the Yup validation schema
    const formik = useFormik({
        initialValues: {
            username: "",
            email: "",
            password: "",
        },
        onSubmit: onSubmit,
        validationSchema: validationSchema,
    });
};

Из приведенного выше фрагмента кода Formik предоставляет свойство validationSchema, которое позволяет нам использовать библиотеку проверки схемы.

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

Использование компонентов Formik

Formik обеспечивает более простой способ создания форм с использованием компонентов. Компоненты Formik позволяют создавать формы более простым способом с меньшим количеством кода. Они упрощают процесс создания динамических и удобных интерфейсов форм в ваших приложениях React.

Давайте воссоздадим форму регистрации, используя компоненты Formik:

import { Form, Formik, Field, ErrorMessage } from "formik";const App = () => {
    const initialValues = {
        username: "",
        email: "",
        password: "",
    };

    return (
        <div>
            <Formik
                initialValues={initialValues}
                onSubmit={onSubmit}
                validationSchema={validationSchema}
            >
                <Form>
                    <h2>Log in</h2>
                    <label htmlFor='name'>Username</label>
                    <Field type='text' id='username' name='username' />
                    <ErrorMessage name='username' render={(msg) => <p>{msg}</p>} />

                    <label htmlFor='email'>Email</label>
                    <Field type='email' id='email' name='email' />
                    <ErrorMessage name='email' render={(msg) => <p>{msg}</p>} />

                    <label htmlFor='password'>Password</label>
                    <Field type='password' id='password' name='password' />
                    <ErrorMessage name='password' render={(msg) => <p>{msg}</p>} />

                    <button type='submit'>REGISTER</button>
                </Form>
            </Formik>
        </div>
    );
};

Компонент Formik оборачивает всю форму и принимает начальные значения, функцию onSubmit и метод проверки в качестве реквизита.

Formik также предоставляет другие компоненты, такие как Form, Field и ErrorMessage, используемые для замены тега формы, тега ввода и сообщения об ошибке соответственно.

Заключение

На данный момент вы научились работать с формами в React.

Мы обсудили проверку входных данных формы с использованием пользовательских функций JavaScript, а также с помощью Zod и Yup. Кроме того, вы узнали, как использовать библиотеки управления формами, такие как React Hook Form и Formik.

Библиотеки управления формами, такие как React Hook и Formik, подходят для обработки значений форм, требующих сложной проверки. Zod и Yup можно использовать для проверки данных, полученных из формы, перед сохранением данных в базе данных.

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

Спасибо за чтение. Если вам нравится этот блог и вы хотите узнать больше о ReactJS и JavaScript, начните читать последние статьи.

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

ByteSizedBets


Также опубликовано здесь.


Оригинал