#reactjs #formik #yup
Вопрос:
Я пытаюсь проверить Formik FieldArray с помощью Yup, он проверяет исходные поля , но не проверяет сгенерированные с помощью dyanmic, даже если они требуются.
Сообщение об ошибке отображается только в том случае, если оно сгенерировано с помощью dyanmically, когда я нажимаю на него (2-я строка insurance_company)и удаляю!
Я новичок в мире Reactjs/Formik, любая помощь приветствуется.
function VehicleForm(props) {
const { data, update, manuf, vmodel, vcat } = props
const initialValues = {
vehicle_manufacturer: data?.vehicle_manufacturer || 1,
vehicle_category: data?.vehicle_category || 1,
vehicle_model: data?.vehicle_model || 1,
origin_country: data?.origin_country || 1,
insurance_details_array: [{ policy_number: "", insurance_company: "", insured_amount: "", insurance_expiry: "", premium_term: "" }],
}
const validationSchema = Yup.object({
vehicle_manufacturer: Yup.string().required("Required"),
vehicle_category: Yup.string().required("Required"),
vehicle_model: Yup.string().required("Required"),
insurance_details_array: Yup.array(Yup.object({
policy_number: Yup.string().required("Required"),
insurance_company: Yup.string().required("Required"),
insured_amount: Yup.number().required("Required"),
insurance_expiry: Yup.string().required("Required"),
premium_term: Yup.number().required("Required")
})).required("Required"),
})
const onSubmit = async (values, formik) => {
}
return (<>
<Formik
initialValues={initialValues}
validationSchema={validationSchema}
onSubmit={onSubmit}
>
{
formik => {
return (
<div className="container">
<Form >
<div className="row" >
<div className="col-md-6">
<FormikControl controls="select" name="vehicle_manufacturer" label="Vehicle Manufacturer" options={manuf.manuf} extraclass="" className="form-control" />
</div>
<div className="col-md-6">
<FormikControl controls="select" name="vehicle_category" label="Vehicle Category" options={vcat.vcat} extraclass="" className="form-control" />
</div>
</div>
<div className="row" >
<div className="col-md-6">
<FormikControl controls="select" name="vehicle_model" label="Vehicle Model" options={vmodel.vmodel} extraclass="" className="form-control" />
</div>
<div className="col-md-6">
{/* <FormikControl controls="select" name="origin_country" label="Origin Country" options={dropdown} extraclass="" className="form-control" /> */}
<Country name="origin_country" label="Origin Country" extraclass="form-control" />
</div>
</div>
<div className="col-md-12">
<label>Insurance Details</label>
<FieldArray name="insurance_details_array">
{
(fieldsArrayProps2) => {
const { push, remove, form } = fieldsArrayProps2
const { values } = form
const { insurance_details_array } = values
return (
<div>
{
values.insurance_details_array.map((ins_d, index) => (
<div className="row" key={index}>
<div className="col-md-2" >
<FormikControl className="form-control" placeholder="policy_number" name={`insurance_details_array.${index}.policy_number`} controls="input" id={`insurance_details_array.${index}.policy_number`} />
</div>
<div className="col-md-2" >
<FormikControl className="form-control" placeholder="insurance_company" name={`insurance_details_array.${index}.insurance_company`} controls="input" id={`insurance_details_array.${index}.insurance_company`} />
</div>
<div className="col-md-2" >
<FormikControl className="form-control" placeholder="insured_amount" name={`insurance_details_array.${index}.insured_amount`} controls="input" id={`insurance_details_array.${index}.insured_amount`} />
</div>
<div className="col-md-2" >
<FormikControl className="form-control" placeholder="insurance_expiry" name={`insurance_details_array.${index}.insurance_expiry`} controls="date" id={`insurance_details_array.${index}.insurance_expiry`} />
</div>
<div className="col-md-2" >
<FormikControl className="form-control" placeholder="premium_term" name={`insurance_details_array.${index}.premium_term`} controls="input" id={`insurance_details_array.${index}.premium_term`} />
</div>
<div className="col-md-2" >
{
index > 0 ? <button type="button" onClick={() => remove({ index })} className="btn btn-primary " >-</button> : ""
}
<button type="button" onClick={() => push("")} className="btn btn-primary m-1" > </button>
</div>
</div>
))
}
</div>
)
}
}
</FieldArray>
</div>
<div className="row">
<button type="submit" className="btn btn-primary">Submit</button>
</div>
</Form>
</div>
)
}
}
</Formik>
</>)
}
export default VehicleForm;
Комментарии:
1. вы случайно не разгадали ее? я сталкиваюсь с той же проблемой
2. @henok проверь мой ответ
Ответ №1:
Я решил эту проблему, используя ввод пустого поля в push, что дало бы необходимые ошибки.
<button
type="button"
onClick={() => push({ fieldname: "", fieldname2: "" })}
className="btn btn-primary m-1"
>
</button>