Как я могу проверить только одно поле из формы используя Yup?
Схема выглядит так:
const ValidationScheme = Yup.object().shape({
email: Yup.string()
.required('Required')
.email('Invalid email address'),
password: Yup.string()
.required('Required'),
code: Yup.number()
.integer()
.positive()
.typeError('You must specify a number')
.required('Required'),
});
При клике на кнопку мне нужно провалидировать только поле "email" из формы. Удалить остальные поля из схемы я не могу, они мне нужны в другой логике (сабмит формы). Как мне это сделать? P.S это всё работает на Реакте |
Пробовали так?
const emailFieldValidationScheme = Yup.string()
.required('Required')
.email('Invalid email address');
const ValidationScheme = Yup.object().shape({
email: emailFieldValidationScheme,
password: Yup.string()
.required('Required'),
code: Yup.number()
.integer()
.positive()
.typeError('You must specify a number')
.required('Required'),
});
emailFieldValidationScheme.validateSync('test');
|
Цитата:
https://i.ibb.co/T2w9VPX/Screenshot-20220726-143353.png |
CryNet, ну так перехватите эти ошибки и отобразите для пользователя.
|
Цитата:
if (rEmail.test(email)) {
clearErrors('email');
} else {
return setError('email', { message: 'Invalid email address' });
}
Но я бы хотел, чтобы это полностью обработал Yup. Но ваш костыль получше моего. |
Цитата:
|
Цитата:
const {
handleSubmit,
control,
formState: { errors }, // !important
setError,
register,
clearErrors,
getValues,
} = useForm<ILoginForm>({
resolver: yupResolver(ValidationScheme),
defaultValues: {
email: '',
password: '',
code: '',
},
});
Провозившись с Yum-ом забыл расписать нормально. При клике на Сабмит ошибка из Yum-а попадает в react-hook-form: resolver: yupResolver(ValidationScheme). Видимо таки придётся совместить ваше решение с моим. Я почему-то надеялся, что можно как-то более лаконично решить это. В любом случае -- спасибо вам за идею. |
CryNet, зачем вам понадобилось проверять одно единственное поле на корректность введенных пользователем данных?
Мне кажется, что вы решаете несуществующую проблему, либо существующую, но не тем способом. |
Цитата:
- password - 2FA И две кнопки: - Get 2FA - Submit Флоу такой: - юзер заполнил поля email и password и кликает на кнопку Get 2FA (вот тут мне нужно проверить это единственное поле) - юзер вводит 2FA и кликает на Сабмит (тут проверяется всё остальное) |
CryNet, я бы сделал как-то так только через class component:
https://codesandbox.io/s/form-exampl...c/LoginForm.js
import React, { useState } from "react";
import { useForm } from "react-hook-form";
import { yupResolver } from "@hookform/resolvers/yup";
import * as Yup from "yup";
export default function LoginForm() {
const [tokenWasRequested, saveTokenWasRequested] = useState(false);
const validationScheme = Yup.object().shape({
email: Yup.string().required("Required").email("Invalid email address"),
...(tokenWasRequested
? {
password: Yup.string().required("Required"),
code: Yup.number()
.integer()
.positive()
.typeError("You must specify a number")
.required("Required")
}
: {})
});
const {
register,
handleSubmit,
formState: { errors }
} = useForm({
mode: "all",
criteriaMode: "all",
resolver: yupResolver(validationScheme)
});
const onSubmit = (data) => {
if (!tokenWasRequested) {
saveTokenWasRequested(true);
return;
}
console.log(data);
};
const fields = [
{
type: "email",
name: "email",
label: "Email",
props: {
readOnly: tokenWasRequested
}
}
];
if (tokenWasRequested) {
fields.push(
{
type: "password",
name: "password",
label: "Password"
},
{
type: "text",
name: "code",
label: "2FA token"
}
);
}
return (
<form onSubmit={handleSubmit(onSubmit)}>
{fields.map((field) => {
const errorMessage = errors?.[field.name]?.message;
return (
<div
key={`form-field--${field.type}-${field.name}`}
className="field-wrapper"
>
<input
{...(field.props ?? {})}
type={field.type}
placeholder={field.label}
className={errorMessage ? "invalid" : undefined}
{...register(field.name)}
/>
{errorMessage ? (
<div className="error-message">{errorMessage}</div>
) : null}
</div>
);
})}
<div className="form-controls">
<button type="submit">
{tokenWasRequested ? "Login" : "Get 2FA token"}
</button>
{tokenWasRequested ? (
<button
type="button"
onClick={() => {
saveTokenWasRequested(false);
}}
>
Request another 2FA token
</button>
) : null}
</div>
</form>
);
}
|
Цитата:
|
CryNet, текущий компонент, имхо, плохо читаем.
В классе данные и "действия" можно раскидать по разным методам улучшив его читаемость. |
Цитата:
|
Цитата:
Лично я не вижу проблем, чтобы использовать как первые так и вторые в проекте единовременно, если этому есть рациональное объяснение. Другое дело, если на проекте изначально принято писать компоненты в функциональном стиле, а вы адепт классовых компонентов и любой незначительный компонент пишете в этом стиле. Возможно кто-то из здесь присутствующих более опытных коллег поделится своим опытом и мыслями по этому поводу. |
Цитата:
|
CryNet, зачем вам понадобилось проверять одно единственное поле на корректность введенных пользователем данных?
panoramacharter.ltd router admin login |
| Часовой пояс GMT +3, время: 08:38. |