React Aria предоставляет набор хуков для создания доступных
компонентов пользовательского интерфейса, включая формы. Управление
состоянием формы здесь строится на разделении логики состояния и
визуального представления. Основным инструментом является хук
useFormState, который управляет данными формы, валидацией и
взаимодействием с полями.
Хук useFormState создаёт объект состояния формы:
import { useFormState } from '@react-stately/form';
const formState = useFormState({
defaultValues: {
name: '',
email: ''
},
onSubmit: (values) => {
console.log('Submitted:', values);
}
});
Ключевые моменты:
defaultValues — начальные значения всех полей.onSubmit — функция, вызываемая при успешной
отправке.defaultValues или через методы состояния.formState содержит важные свойства:
values — текущие значения полей.setValue(name, value) — метод для изменения конкретного
значения.errors — объект ошибок валидации.isSubmitting — флаг отправки формы.Для полей используется хук useField, который
интегрируется с useFormState:
import { useField } from '@react-aria/label';
import { useTextField } from '@react-aria/textfield';
function TextInput({ name, formState }) {
const { labelProps, fieldProps } = useField({ name }, formState);
const { inputProps } = useTextField(fieldProps);
return (
<label {...labelProps}>
{name}
<input {...inputProps} />
</label>
);
}
Особенности:
useField связывает поле с формой, предоставляя
fieldProps и labelProps.fieldProps содержит имя, текущее значение, обработчики
событий (onChange, onBlur).labelProps гарантируют корректную доступность для
скринридеров.React Aria не накладывает строгих правил валидации, но интегрируется с кастомными функциями:
const formState = useFormState({
defaultValues: { email: '' },
validation: (values) => {
const errors = {};
if (!values.email.includes('@')) {
errors.email = 'Email должен содержать @';
}
return errors;
},
onSubmit: (values) => console.log(values)
});
Принципы работы с ошибками:
errors хранит ошибки по имени поля.aria-invalid и
aria-describedby для уведомления скринридеров.setValue позволяет
отображать ошибки в реальном времени.Для форм с повторяющимися или динамическими элементами используется
хук useFieldArray:
import { useFieldArray } from '@react-stately/form';
function TagsForm({ formState }) {
const { fields, addField, removeField } = useFieldArray('tags', formState);
return (
<>
{fields.map((field, index) => (
<TextInput key={field.key} name={`tags[${index}]`} formState={formState} />
))}
<button onCl ick={() => addField('')}>Добавить тег</button>
</>
);
}
Преимущества:
useField.Форма управляется через компонент <form> с
обработчиком onSubmit:
function MyForm() {
const formState = useFormState({
defaultValues: { name: '', email: '' },
onSubmit: (values) => console.log(values)
});
return (
<form onSub mit={formState.handleSubmit}>
<TextInput name="name" formState={formState} />
<TextInput name="email" formState={formState} />
<button type="submit" disabled={formState.isSubmitting}>Отправить</button>
</form>
);
}
Особенности:
formState.handleSubmit выполняет проверку валидации и
вызывает onSubmit.isSubmitting предотвращает повторную отправку.React Aria позволяет легко подключать нестандартные элементы:
useField для привязки состояния и
меток.aria-* атрибуты генерируются автоматически.setValue и setError позволяют
контролировать значения и ошибки вручную.function CustomCheckbox({ name, formState }) {
const { fieldProps } = useField({ name }, formState);
return (
<div role="checkbox"
aria-checked={formState.values[name]}
onCl ick={() => formState.setValue(name, !formState.values[name])}>
{name}
</div>
);
}
Эта архитектура позволяет создавать сложные формы с динамическими полями, полной поддержкой доступности и централизованным управлением состояния без необходимости вручную синхронизировать поля и их ошибки.