Chakra UI предоставляет удобные инструменты для построения форм с высокой кастомизацией и доступностью. Библиотека интегрируется с популярными библиотеками управления состоянием форм, такими как React Hook Form, Formik и Yup, обеспечивая удобное связывание компонентов интерфейса с логикой валидации и отправки данных.
Chakra UI включает ряд компонентов, специально предназначенных для создания форм:
Пример базовой структуры поля с валидацией:
import { FormControl, FormLabel, Input, FormErrorMessage, Button } from "@chakra-ui/react";
import { useForm } from "react-hook-form";
function MyForm() {
const { handleSubmit, register, formState: { errors } } = useForm();
const onSub mit = values => console.log(values);
return (
<form onSub mit={handleSubmit(onSubmit)}>
<FormControl isInvalid={errors.name}>
<FormLabel>Имя</FormLabel>
<Input {...register("name", { required: "Это поле обязательно" })} />
<FormErrorMessage>{errors.name && errors.name.message}</FormErrorMessage>
</FormControl>
<Button mt={4} colorScheme="teal" type="submit">Отправить</Button>
</form>
);
}
React Hook Form позволяет управлять состоянием формы
без лишнего ререндеринга и значительно упрощает работу с валидацией.
Chakra UI предоставляет прямую совместимость через пропсы
isInvalid и стандартные компоненты формы.
register связывает поля с формой.formState.errors хранит информацию о нарушениях
валидации.handleSubmit обрабатывает отправку данных.Для комплексной валидации можно использовать библиотеку Yup:
import * as yup from "yup";
import { yupResolver } from "@hookform/resolvers/yup";
const schema = yup.object().shape({
email: yup.string().email("Неверный формат почты").required("Обязательное поле"),
password: yup.string().min(6, "Минимум 6 символов").required("Обязательное поле"),
});
const { register, handleSubmit, formState: { errors } } = useForm({
resolver: yupResolver(schema)
});
Chakra UI позволяет легко стилизовать поля в зависимости от состояния:
isInvalid – делает поле красным при ошибке.isDisabled – делает поле недоступным для ввода.isReadOnly – разрешает только чтение значения.focusBorderColor – настраивает цвет рамки при
фокусе.errorBorderColor – цвет рамки при ошибке.Пример:
<Input
placeholder="Введите email"
{...register("email")}
isInvalid={errors.email}
focusBorderColor="blue.500"
errorBorderColor="red.500"
/>
Для организации сложных форм используется VStack или SimpleGrid, чтобы структурировать элементы и поддерживать согласованное расстояние между ними:
import { VStack, SimpleGrid } from "@chakra-ui/react";
<VStack spacing={4}>
<FormControl>...</FormControl>
<FormControl>...</FormControl>
</VStack>
<SimpleGrid columns={2} spacing={4}>
<FormControl>...</FormControl>
<FormControl>...</FormControl>
</SimpleGrid>
Chakra UI позволяет легко подключать кастомные компоненты к формам.
Любой компонент, который поддерживает проп ref и события
onChange, можно интегрировать с React Hook
Form или Formik через
Controller.
Пример с контроллером:
import { Controller, useForm } from "react-hook-form";
import { Switch, FormControl, FormLabel } from "@chakra-ui/react";
<Controller
name="subscribe"
control={control}
defaultValue={false}
render={({ field }) => (
<FormControl display="flex" alignItems="center">
<FormLabel mb="0">Подписка на новости</FormLabel>
<Switch {...field} />
</FormControl>
)}
/>
Chakra UI совместим с динамическими структурами форм, где количество полей может меняться. Используя useFieldArray из React Hook Form, можно добавлять и удалять элементы с сохранением всех связей и валидации.
import { useFieldArray, useForm } from "react-hook-form";
const { fields, append, remove } = useFieldArray({ name: "friends", control });
{fields.map((item, index) => (
<FormControl key={item.id}>
<Input {...register(`friends.${index}.name`)} />
<Button onCl ick={() => remove(index)}>Удалить</Button>
</FormControl>
))}
<Button onCl ick={() => append({ name: "" })}>Добавить друга</Button>
FormErrorMessage позволяет показывать
текст ошибки непосредственно под полем.Все элементы форм полностью поддерживают систему тем Chakra UI. Можно
задавать цвета, размеры, отступы и типографику глобально через
extendTheme:
import { extendTheme } from "@chakra-ui/react";
const theme = extendTheme({
components: {
Input: {
variants: {
outline: { field: { borderColor: "gray.300", _hover: { borderColor: "blue.500" } } }
}
}
}
});
Эти возможности позволяют создавать гибкие, доступные и визуально согласованные формы, минимизируя необходимость писать кастомный CSS и упрощая управление состоянием форм в React-приложениях.