#javascript #reactjs #validation #formik #yup
Вопрос:
Поэтому я пытаюсь проверить свою форму с помощью пакета Yup, есть функция createForm
для создания формы, которая создает форму с уникальным идентификатором, а затем этот идентификатор передается полям для каждой созданной формы. Я пытаюсь проверить эти поля для каждой созданной формы, но мне не удается проверить эти входные данные с помощью уникального идентификатора. Вот код :
import { nanoid } from 'nanoid';
const AddContact = () => {
const [formData, setFormData] = useState([{key: nanoid()}])
const createForm = () => {
setFormData(prevFormData => [...prevFormData, {key: nanoid()}])
}
const deleteForm = (key) => {
setFormData(prevFormData => prevFormData.filter(item => item.key !== key))
}
return(
<Formik
initialValues={{}}
validationSchema={
formData.map(data => {
Yup.object().shape({
[`name_${data.key}`]: Yup.string().required("Please enter a valid name"),
[`company_${data.key}`]: Yup.string().required("Please enter a Company name"),
[`mobile_no_${data.key}`]: Yup.number().typeError("Please enter a valid mobile number"),
[`email_${data.key}`]: Yup.string().email().required("Please enter a valid email"),
})
})
}
//onSubmit={onSubmit}
>
{({ handleSubmit, values }) => {
return(
<div>
{formData.map((data, index) => {
return(
<button onClick={() => deleteForm(data.key)}}>
<input name={`name_${data.key}`}>
<input name={`company_${data.key}`}>
<input name={`mobile_no_${data.key}`}>
<input name={`email_${data.key}`}>
)})}
<button onClick={createForm}/>
</div>
)
}}
Ответ №1:
Попробуйте этот код: я создал validationSchema из FormData, и он отлично работает, как показано errors
на рисунке и values
в нижней части формы прямо сейчас.
import React, { useState } from "react";
import { Formik } from "formik";
import { nanoid } from "nanoid";
import * as Yup from "yup";
const AddContact = () => {
const [formData, setFormData] = useState([{ key: nanoid() }]);
const createForm = () => {
setFormData((prevFormData) => [...prevFormData, { key: nanoid() }]);
};
const deleteForm = (key) => {
setFormData((prevFormData) =>
prevFormData.filter((item) => item.key !== key)
);
};
const validationSchema = {
...formData.reduce((result, data) => {
result = {
...result,
[`name_${data.key}`]: Yup.string().required(
"Please enter a valid name"
),
[`company_${data.key}`]: Yup.string().required(
"Please enter a Company name"
),
[`mobile_no_${data.key}`]: Yup.number().typeError(
"Please enter a valid mobile number"
),
[`email_${data.key}`]: Yup.string()
.email()
.required("Please enter a valid email")
};
return resu<
}, {})
};
return (
<Formik
initialValues={{}}
validationSchema={Yup.object().shape(validationSchema)}
>
{({ handleSubmit, values, errors, handleChange }) => {
return (
<div>
{formData.map((data, index) => (
<div key={index} style={{ margin: 10 }}>
<button onClick={() => deleteForm(data.key)}>Delete</button>
<input name={`name_${data.key}`} onChange={handleChange} />
<input name={`company_${data.key}`} onChange={handleChange} />
<input name={`mobile_no_${data.key}`} onChange={handleChange} />
<input name={`email_${data.key}`} onChange={handleChange} />
</div>
))}
<button onClick={createForm} style={{ margin: 10 }}>
Create Form
</button>
<button type="submit" onClick={handleSubmit}>
Submit
</button>
{errors amp;amp; (
<div>
<div>ERRORS: {JSON.stringify(errors)}</div>
<div>VALUES: {JSON.stringify(values)}</div>
</div>
)}
</div>
);
}}
</Formik>
);
};
export default AddContact;
Комментарии:
1. Я пробовал этот способ, но при создании нескольких форм везде отображаются одни и те же ошибки
2. В
errors
нем также есть подробная информация о поле, поэтому вы должны условно отобразить ошибку на основе поля.