MDX, как расширение JSX, позволяет не только описывать статический контент, но и интегрировать интерактивные элементы, включая формы. Формы в MDX создаются аналогично стандартным HTML-формам, но с полной поддержкой компонентов React. Это открывает возможности для динамической валидации, управления состоянием и кастомизации элементов.
Здесь handleSubmit — это функция, обрабатывающая событие
отправки формы, а value и onChange
обеспечивают двустороннюю привязку данных с состоянием React.
MDX позволяет использовать React-хуки для управления состоянием формы:
import { useState } from 'react';
const [name, setName] = useState('');
const [email, setEmail] = useState('');
const handleSubmit = (e) => {
e.preventDefault();
console.log({ name, email });
};
Ключевой момент: каждое поле формы должно иметь собственный хук состояния, что обеспечивает реактивность и позволяет мгновенно отображать изменения.
Валидация может быть реализована как на стороне клиента, так и на стороне сервера. Для клиентской валидации часто используют функции-проверки внутри компонента:
const validateEmail = (email) => {
const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
return regex.test(email);
};
const handleSubmit = (e) => {
e.preventDefault();
if (!validateEmail(email)) {
alert('Некорректный email');
return;
}
console.log({ name, email });
};
Важно: регулярные выражения помогают быстро
проверять синтаксис, но сложные правила лучше обрабатывать на сервере
или с использованием библиотек типа Yup или
Zod.
MDX поддерживает подключение внешних библиотек для управления формами и их валидации, что позволяет создавать более масштабируемые решения:
import { useForm } from 'react-hook-form';
const { register, handleSubmit, formState: { errors } } = useForm();
Ключевые моменты библиотеки
react-hook-form:
MDX позволяет создавать формы с динамически изменяющимися полями:
const [fields, setFields] = useState([{ name: '', email: '' }]);
const addField = () => setFields([...fields, { name: '', email: '' }]);
fields.map((field, index) => (
updateField(index, 'name', e.target.value)} />
updateField(index, 'email', e.target.value)} />
));
const updateField = (index, key, value) => {
const newFields = [...fields];
newFields[index][key] = value;
setFields(newFields);
};
Динамические формы позволяют пользователю добавлять и удалять поля по необходимости, сохраняя при этом реактивное состояние и валидацию для каждого элемента.
Иногда необходимо проверять данные на сервере до отправки формы. В MDX это реализуется через асинхронные функции:
const checkUsername = async (username) => {
const response = await fetch(`/api/check-username?username=${username}`);
const data = await response.json();
return data.available;
};
const handleSubmit = async (e) => {
e.preventDefault();
const available = await checkUsername(name);
if (!available) {
alert('Имя пользователя уже занято');
return;
}
console.log({ name, email });
};
Асинхронная проверка позволяет сразу информировать пользователя о проблемах, не дожидаясь полной отправки формы.
MDX полностью поддерживает использование React-компонентов для кастомных элементов форм:
const CustomInput = ({ label, value, onChange }) => (
);
setName(e.target.value)} />
Преимущества использования кастомных компонентов:
Правильная обработка ошибок в MDX-формах включает:
Это улучшает опыт пользователя и снижает количество неверных отправок формы.