Нативная форма

Для работы с простой формой ( имеется ввиду html тег <form> ) можно использовать следующий подход.

Live Editor

Result

Валидация

Для валидации можно использовать как сторонние библиотеки, так и собственное решение:

Пример CodeSandbox

export function App() {
const emailOptions = {
minLength: {
value: 7,
errorMessage: 'Почта слишком короткая',
},
maxLength: {
value: 30,
errorMessage: 'Почта слишком длинная',
},
minHostLength: {
value: 2,
errorMessage: 'Хост слишком короткий',
},
maxHostLength: {
value: 12,
errorMessage: 'Хост слишком длинный',
},
minDomainLength: {
value: 3,
errorMessage: 'Домен слишком короткий',
},
maxDomainLength: {
value: 6,
errorMessage: 'Домен слишком длинный',
},
minZoneLength: {
value: 2,
errorMessage: 'Доменная зона слишком короткая',
},
maxZoneLength: {
value: 5,
errorMessage: 'Доменная зона слишком длинная',
},
whitelistDomains: {
value: ['plasma.ru', 'gmail.com', 'mail.ru'],
errorMessage: 'Домен не разрешен',
},
blacklistDomains: {
value: ['hah.ah', 'heh.eh'],
errorMessage: 'Домен запрещен',
},
};

const passwordOptions = {
minLength: {
value: 5,
errorMessage: 'Пароль слишком короткий',
},
maxLength: {
value: 20,
errorMessage: 'Пароль слишком длинный',
},
includeUppercase: {
value: true,
errorMessage: 'Пароль должен содержать хотя бы одну заглавную букву',
},
includeLowercase: {
value: true,
errorMessage: 'Пароль должен содержать хотя бы одну строчную букву',
},
includeDigits: {
value: true,
errorMessage: 'Пароль должен содержать хотя бы одну цифру',
},
includeSpecialSymbols: {
value: true,
errorMessage: 'Пароль должен содержать хотя бы один специальный символ',
},
};

const [emailError, setEmailError] = useState('');
const [passwordError, setPasswordError] = useState('');
const [hidden, setHidden] = useState(false);

const handleOnChange = () => {
setEmailError('');
};

const handleOnValidate = ({ errorMessage }: { errorMessage?: string }) => {
setPasswordError(errorMessage || '');
};

const toggleShowPassword = () => setHidden(!hidden);

const HideButton = () => (
<IconButton size="s" view="clear" onClick={toggleShowPassword}>
{hidden ? <IconEyeClosedFill size="xs" color="inherit" /> : <IconEyeFill size="xs" color="inherit" />}
</IconButton>
);

const { handleValidationBlur: handleBlurEmail, handleValidationKeyDown: handleKeyDownEmail } = useValidation({
validationType: 'email',
options: emailOptions,
onValidate: handleOnValidate,
});

const { handleValidationBlur: handleBlurPassword, handleValidationKeyDown: handleKeyDownPassword } = useValidation({
validationType: 'password',
options: passwordOptions,
onValidate: handleOnValidate,
});

return (
<div style={{ display: 'flex', flexDirection: 'column', gap: '20px' }}>
<TextField
label="Валидация почты"
placeholder="Заполните поле"
validationType="email"
options={emailOptions}
status={emailError ? 'error' : undefined}
helperText={emailError || 'Валидация почты'}
onChange={handleOnChange}
onBlur={handleBlurEmail}
onKeyDown={handleKeyDownEmail}
/>
<TextField
label="Валидация пароля"
placeholder="Заполните поле"
validationType="password"
options={passwordOptions}
status={passwordError ? 'error' : undefined}
helperText={passwordError || 'Валидация пароля'}
onChange={handleOnChange}
onBlur={handleBlurPassword}
onKeyDown={handleKeyDownPassword}
passwordHidden={hidden}
contentLeft={<HideButton />}
/>
</div>
);
}