Radix UI предоставляет компонент Message, который служит для отображения кратких уведомлений пользователю, таких как ошибки, предупреждения, успехи или информационные сообщения. Компонент строится с использованием атомарных элементов, обеспечивая высокую кастомизацию и контроль над поведением уведомлений.
Компонент Message включает несколько ключевых элементов:
Пример базового JSX-кода компонента:
Ошибка загрузки данных
Не удалось получить информацию с сервера. Попробуйте позже.
Закрыть
Ключевой момент: Message.Root
контролирует состояние отображения через пропсы open и
onOpenChange, что позволяет интегрировать компонент с
внешними системами управления состоянием.
Radix UI не навязывает конкретную систему управления состоянием. Возможны два подхода:
open передается извне, а onOpenChange сообщает
о действиях пользователя.Пример контролируемого подхода:
const [open, setOpen] = useState(false);
Успешно сохранено
Данные пользователя обновлены.
Закрыть
Radix UI использует подход unstyled, что означает полную свободу в применении CSS или библиотек типа Tailwind.
Основные методы кастомизации:
className для
каждого элемента (Root, Title,
Description, Close).Message.Title или
Message.Description.Пример с Tailwind:
Ошибка
Произошла ошибка при сохранении формы.
×
Message идеально подходит для отображения ошибок в формах. Для этого используется комбинация с библиотеками валидации, например, React Hook Form или Formik.
Пример интеграции с React Hook Form:
import { useForm } from "react-hook-form";
const Form = () => {
const { register, handleSubmit, formState: { errors } } = useForm();
const onSub mit = data => console.log(data);
return (
);
};
Особенности:
Radix UI предоставляет возможность работать с анимацией появления и исчезновения:
onOpenChange и open позволяют
запускать действия при открытии или закрытии.useEffect для автоматического
скрытия сообщений через заданное время.Пример автоматического закрытия:
Успех
Данные сохранены.
Закрыть
useEffect(() => {
if (open) {
const timer = setTimeout(() => setOpen(false), 5000);
return () => clearTimeout(timer);
}
}, [open]);
role="alert" и использовать
aria-live="assertive" для сообщений об ошибках.