Atomico предоставляет мощный и гибкий способ создания веб-компонентов с использованием реактивного подхода, и валидация полей является важным аспектом при построении интерактивных компонентов. Валидация данных помогает гарантировать корректность значений свойств и предотвращает непредсказуемое поведение компонента.
В Atomico все свойства компонента определяются через функцию
props. Каждый проп можно типизировать и задать
значение по умолчанию, а также определить
пользовательскую функцию проверки.
import { c, props } from "atomico";
const MyComponent = c(() => {
return <div>{}</div>;
}, {
props: {
username: String,
age: Number,
email: {
type: String,
default: "",
validate: value => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)
}
}
});
Ключевые моменты:
type задает ожидаемый тип значения
(String, Number, Boolean,
Array, Object и т.д.).default определяет значение, которое будет
использовано, если проп не передан.validate — функция проверки, возвращающая
true для корректного значения и false для
некорректного.Для сложной логики проверки можно использовать кастомные функции:
email: {
type: String,
validate: value => {
if (value.length < 5) return false;
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value);
}
}
Такой подход позволяет комбинировать проверку формата и
длины, а также любые другие условия. В случае несоответствия
validate значение не будет применено к свойству компонента,
предотвращая некорректное состояние.
Atomico поддерживает реактивные вычисления через хук
useMemo и useState. Проверка значений может
выполняться динамически при изменении пропов:
import { c, useMemo, useState } from "atomico";
const FormInput = c(({ value }) => {
const [error, setError] = useState("");
const isValid = useMemo(() => {
if (!value) return "Поле не должно быть пустым";
if (!/^[a-zA-Z]+$/.test(value)) return "Только латинские буквы";
return "";
}, [value]);
setError(isValid);
return <input value={value} aria-invalid={!!error} />;
});
Особенности:
useMemo позволяет пересчитывать валидность только при
изменении зависимостей, что снижает нагрузку на компонент.aria-invalid используется для семантической индикации
ошибки в DOM.Atomico поддерживает автоматическую проверку типов, но для числовых и строковых значений можно добавлять ограничения диапазона:
const NumberInput = c(() => {}, {
props: {
value: {
type: Number,
default: 0,
validate: v => v >= 0 && v <= 100
}
}
});
В данном примере число автоматически проверяется на соответствие диапазону от 0 до 100, что предотвращает некорректное поведение компонента без дополнительных условий в шаблоне.
Для комплексных форм удобно хранить объект ошибок и обновлять его при изменении значений:
import { useState } from "atomico";
const formErrors = useState({ username: "", email: "" });
function validateField(name, value) {
switch (name) {
case "username":
formErrors[name] = value.length < 3 ? "Слишком короткое имя" : "";
break;
case "email":
formErrors[name] = /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value) ? "" : "Некорректный email";
break;
}
}
Такой подход позволяет хранить ошибки централизованно и реагировать на них как в визуальной части, так и при отправке данных на сервер.
Atomico позволяет создавать события компонентов для передачи информации о состоянии полей:
const InputWithEvent = c(({ value }, { emit }) => {
const handleChange = (e) => {
const val = e.target.value;
const valid = val.length >= 3;
emit("validate", { value: val, valid });
};
return <input value={value} onIn put={handleChange} />;
});
Это упрощает интеграцию с формами, где отдельные поля должны уведомлять родительский компонент о своей валидности.
Atomico-компоненты легко включаются в сторонние решения для
управления формами, например с использованием реактивных хранилищ
(redux, zustand) или нативных HTML-форм.
Главное — обеспечить корректную проверку через validate и
события, что гарантирует синхронность состояния полей и UI.
Валидация полей в Atomico строится вокруг типизации пропов, кастомных валидаторов и реактивных вычислений, что делает компоненты безопасными и предсказуемыми. Сочетание этих подходов позволяет создавать сложные формы с динамической проверкой, централизованным хранением ошибок и гибкой интеграцией с другими частями приложения.