Chakra UI предоставляет мощный набор компонентов для построения форм,
включая FormControl, FormLabel,
Input, FormErrorMessage и
FormHelperText. Эти компоненты позволяют легко
интегрировать валидацию и обеспечивать единообразный пользовательский
интерфейс.
Input через свойство htmlFor.Пример базовой структуры формы с валидацией:
import { FormControl, FormLabel, Input, FormErrorMessage, Button } from "@chakra-ui/react";
import { useState } from "react";
function ExampleForm() {
const [value, setValue] = useState("");
const [isError, setIsError] = useState(false);
const handleSubmit = (e) => {
e.preventDefault();
setIsError(value === "");
};
return (
<form onSub mit={handleSubmit}>
<FormControl isInvalid={isError}>
<FormLabel htmlFor="name">Имя</FormLabel>
<Input
id="name"
value={value}
onCha nge={(e) => setValue(e.target.value)}
/>
{isError && <FormErrorMessage>Имя обязательно</FormErrorMessage>}
</FormControl>
<Button mt={4} type="submit">
Отправить
</Button>
</form>
);
}
isInvalidКлючевой механизм валидации в Chakra UI — свойство
isInvalid у FormControl. Оно принимает булевое
значение, которое определяет, отображается ли ошибка.
isInvalid={true} — поле подсвечивается красным,
показывается FormErrorMessage.isInvalid={false} — поле считается валидным, ошибки не
отображаются.Можно комбинировать с проверкой на длину, формат email или кастомные правила:
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
setIsError(!emailRegex.test(value));
Для более сложных форм лучше использовать библиотеку
react-hook-form. Chakra UI легко интегрируется с ней,
позволяя управлять состоянием и ошибками централизованно.
Пример с react-hook-form:
import { useForm } from "react-hook-form";
import { FormControl, FormLabel, Input, FormErrorMessage, Button } from "@chakra-ui/react";
function HookFormExample() {
const { handleSubmit, register, formState: { errors } } = useForm();
const onSub mit = (values) => console.log(values);
return (
<form onSub mit={handleSubmit(onSubmit)}>
<FormControl isInvalid={errors.name}>
<FormLabel htmlFor="name">Имя</FormLabel>
<Input
id="name"
{...register("name", { required: "Имя обязательно" })}
/>
<FormErrorMessage>
{errors.name && errors.name.message}
</FormErrorMessage>
</FormControl>
<Button mt={4} type="submit">
Отправить
</Button>
</form>
);
}
register связывает поле с контроллером формы.errors содержит все ошибки валидации.FormControl автоматически отображает ошибку через
isInvalid.В Chakra UI можно реализовать проверку как на onChange,
так и на onBlur:
Пример:
<Input
id="email"
value={email}
onCha nge={(e) => setEmail(e.target.value)}
onB lur={() => setIsError(!emailRegex.test(email))}
/>
Можно комбинировать несколько условий, используя логические операторы:
const isError = value.length < 3 || !emailRegex.test(value);
<FormControl isInvalid={isError}>
Такой подход позволяет создавать комплексные проверки без
использования сторонних библиотек, хотя интеграция с
react-hook-form или formik упрощает управление
большим количеством полей.
Chakra UI позволяет кастомизировать стиль ошибок:
<FormErrorMessage color="red.500" fontSize="sm">
Поле обязательно
</FormErrorMessage>
Можно менять цвет, размер шрифта, отступы и добавлять иконки, чтобы визуально выделять ошибки.
Если количество полей зависит от состояния, Chakra UI корректно
управляет FormControl для каждого элемента:
fields.map((field, index) => (
<FormControl key={index} isInvalid={errors[field.name]}>
<FormLabel htmlFor={field.name}>{field.label}</FormLabel>
<Input id={field.name} {...register(field.name, field.rules)} />
<FormErrorMessage>
{errors[field.name]?.message}
</FormErrorMessage>
</FormControl>
))
Такой подход используется для динамических списков, где каждый элемент требует собственной валидации.
Валидация форм в Chakra UI строится на сочетании
FormControl и свойств полей, что позволяет создавать как
простые, так и сложные формы с удобной интеграцией внешних библиотек,
централизованным управлением ошибками и гибкой кастомизацией внешнего
вида.