Валидация на клиенте играет ключевую роль в создании надежных и
удобных форм. В библиотеке MUI (Material-UI) она
реализуется через комбинацию компонентов для ввода данных и управления
состоянием формы, таких как TextField,
Checkbox, RadioGroup, Select, а
также библиотек для управления формами, например,
Formik или React Hook Form.
Компонент TextField позволяет легко настроить базовую
проверку данных:
import TextField from '@mui/material/TextField';
import { useState } from 'react';
function Example() {
const [value, setValue] = useState('');
const [error, setError] = useState(false);
const handleChange = (event) => {
const val = event.target.value;
setValue(val);
setError(val.length < 3); // Простая проверка: минимум 3 символа
};
return (
);
}
Ключевые моменты:
error принимает булевое значение, которое
визуально выделяет поле.helperText предоставляет пользователю подсказку или
сообщение об ошибке.onChange), так и при отправке формы
(onSubmit).Для более сложных форм MUI отлично интегрируется с React Hook Form. Этот подход позволяет управлять состоянием формы централизованно и минимизировать повторение кода.
import { useForm, Controller } from 'react-hook-form';
import TextField from '@mui/material/TextField';
import Button from '@mui/material/Button';
function Form() {
const { handleSubmit, control, formState: { errors } } = useForm();
const onSub mit = data => console.log(data);
return (
);
}
Ключевые моменты:
Controller связывает MUI-компоненты с React Hook
Form.rules задает правила валидации: обязательность,
регулярные выражения и пользовательские функции.formState.errors хранит информацию о всех ошибках
формы.MUI позволяет создавать свои правила валидации через callback-функции:
const validatePassword = (value) => {
if (!value) return "Пароль обязателен";
if (value.length < 6) return "Пароль должен содержать минимум 6 символов";
if (!/[A-Z]/.test(value)) return "Пароль должен содержать хотя бы одну заглавную букву";
return true;
};
Использование с TextField через
React Hook Form:
}
/>
Особенности кастомной валидации:
true (успешно),
либо строка с текстом ошибки.Formik — еще один популярный способ управления формами с MUI:
import { Formik, Form, Field } from 'formik';
import * as Yup from 'yup';
import TextField from '@mui/material/TextField';
import Button from '@mui/material/Button';
const validationSchema = Yup.object({
username: Yup.string()
.min(3, 'Минимум 3 символа')
.required('Обязательное поле'),
email: Yup.string()
.email('Неверный формат email')
.required('Обязательное поле')
});
function FormikForm() {
return (
console.log(values)}
>
{({ errors, touched, handleChange, values }) => (
)}
);
}
Преимущества Formik:
Валидация не ограничивается текстовыми полями. Компоненты
Checkbox, Select и RadioGroup
также поддерживают проверку через React Hook Form или Formik.
}
label="Согласен с условиями"
/>
{fieldState.error?.message}
}
/>
Особенности:
FormControl объединяет поле и сообщение об ошибке.Select и RadioGroup используется
аналогичная структура с FormHelperText.Иногда требуется проверка через сервер, например, уникальность email:
const checkEmailAvailability = async (email) => {
const response = await fetch(`/api/check-email?email=${email}`);
const data = await response.json();
return data.available ? true : 'Email уже занят';
};
}
/>
Особенности асинхронной валидации:
Promise, который должен разрешаться либо
true, либо строкой с ошибкой.onBlur) или при отправке формы, чтобы не раздражать
пользователя постоянными подсказками.