Как проверить dyanmic поля fieldArray в Formik с помощью Yup onSubmit

#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>