Как я могу проверить только одно поле из формы используя 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> ); } |
Часовой пояс GMT +3, время: 02:17. |