React Aria предоставляет мощные хуки и утилиты для создания доступных компонентов интерфейса, включая поля ввода, селекты, чекбоксы и радиокнопки. В сочетании с Formik можно реализовать формы, полностью соответствующие стандартам доступности и управляемые через состояния Formik.
Для начала необходимо установить зависимости:
npm install @react-aria/checkbox @react-aria/textfield formik
Импортируем необходимые модули:
import { useField } from 'formik';
import { useTextField } from '@react-aria/textfield';
import { useCheckbox } from '@react-aria/checkbox';
import { useToggleState } from '@react-stately/toggle';
Formik управляет состоянием формы через values,
errors и touched, а React Aria обеспечивает
корректное управление фокусом, клавиатурой и атрибутами ARIA.
Для текстовых полей создается компонент-обертка, который объединяет возможности Formik и React Aria.
function AriaTextField({ label, ...props }) {
const [field, meta] = useField(props);
const { labelProps, inputProps } = useTextField({
...field,
label,
});
return (
<div>
<label {...labelProps}>{label}</label>
<input {...inputProps} />
{meta.touched && meta.error ? (
<div role="alert" style={{ color: 'red' }}>{meta.error}</div>
) : null}
</div>
);
}
Особенности интеграции:
useField предоставляет биндинг значения и обработчиков
для Formik.useTextField добавляет корректные ARIA-атрибуты и
обработку фокуса.role="alert", чтобы быть
доступными для скринридеров.Для чекбоксов важно использовать useCheckbox вместе с
useToggleState из React Stately:
function AriaCheckbox({ label, name }) {
const [field, meta, helpers] = useField({ name, type: 'checkbox' });
const state = useToggleState({ isSelected: field.value });
const { inputProps } = useCheckbox({ ...field, isSelected: state.isSelected }, state);
const handleChange = () => {
state.toggle();
helpers.setValue(state.isSelected);
};
return (
<div>
<label>
<input {...inputProps} onCha nge={handleChange} />
{label}
</label>
{meta.touched && meta.error ? (
<div role="alert" style={{ color: 'red' }}>{meta.error}</div>
) : null}
</div>
);
}
Ключевые моменты:
helpers.setValue.aria-checked и role="checkbox".import { Formik, Form } from 'formik';
import * as Yup from 'yup';
const initialValues = { username: '', acceptTerms: false };
const validationSchema = Yup.object({
username: Yup.string().required('Обязательное поле'),
acceptTerms: Yup.boolean().oneOf([true], 'Необходимо согласие'),
});
function MyForm() {
return (
<Formik initialValues={initialValues} validationSchema={validationSchema} onSub mit={values => console.log(values)}>
{() => (
<Form>
<AriaTextField name="username" label="Имя пользователя" />
<AriaCheckbox name="acceptTerms" label="Я согласен с условиями" />
<button type="submit">Отправить</button>
</Form>
)}
</Formik>
);
}
Особенности реализации:
useTextField и
useCheckbox автоматически управляют фокусом, включая
видимость focus ring.label),
состояния (aria-checked) и уведомления об ошибках
(role="alert") соответствуют стандартам WCAG.Для радиогрупп и селектов применяются аналогичные подходы:
useRadioGroup и
useSelect.value и
onChange.Этот подход позволяет строить формы с множеством типов полей, где React Aria обеспечивает доступность, а Formik управляет состоянием и валидацией.