使用 formik REACT 获取请求数组 [关闭]

问题描述 投票:0回答:0

我需要使用 formik FieldArrays 更新服务器上的信息。我找不到将 [new] 插入新字段然后将它们转换为后端豁免的行的方法。 我从数组中的服务器接收初始数据

 "documents": [
            {
                "document_type": {
                    "id": 1,
                    "name": "Внутренний"
                },
                "citizenship": {
                    "id": 2,
                    "name": "американское"
                },
                "number": "1111 111111",
                "name": "Иван",
                "surname": "Никонов",
                "date": 1677060272
            }
        ]

如果我需要更新信息,对服务器的请求应该是这样的

documents[23][document_type_id]':1,
documents[23][citizenship_id]':1,
documents[23][number]': '44444',
documents[23][surname]': 'ffffff',
documents[23][name]': 'ffffff',
documents[23][date]': 1677060272

如果我添加一些新字段,它们应该看起来像

documents[new][1][document_type_id]':1,
documents[new][1][citizenship_id]':1,
documents[new][1][number]': '44444',
documents[new][1][surname]': 'ffffff',
documents[new][1][name]': 'ffffff',
documents[new][1][date]': 1677060272

父组件

<Formik
            initialValues = {vals}
            validationSchema={SignupSchema}
            enableReinitialize={true}
            onSubmit={(values, { resetForm}) => {
                console.log(values, 'to send')
                const { birth} = values;

                const dataToSend = Object.assign(values, {birth: getUnixTime(new Date(birth))} )
                return updateHandler(dataToSend)
            }}
            >
                {({ values, handleSubmit, handleChange, errors }) => (
                <Form onSubmit={handleSubmit} className="form control__form">
                    <div className="form__block bordered white">
                        <h3 className="h3">Данные</h3>
                        <div className="form__fieldset">
                            <Field
                                name={`surname`}
                                component={Input}
                                label='Фамилия'
                                type='text'
                                />
                            <Field
                                name={`name`}
                                component={Input}
                                label='Имя'
                                type='text'
                                />
                            <Field
                                name={`patronymic`}
                                component={Input}
                                label='Отчество'
                                type='text'
                                />
                        </div>
                        <div className="form__fieldset">
                            <Field
                                name={`birth`}
                                component={Datapicker2}
                                label='Дата рождения'
                                />
                            <div className="form__label-radio">
                                <div className="name">Пол</div>
                                <label className="label-radio">
                                    <Field 
                                        type='radio' 
                                        name='sex_id'
                                        className="input-radio"  
                                        value='1'/>
                                    <span className="input-radio__mark"></span>
                                    <span>Мужской</span>
                                </label>
                                <label className="label-radio">
                                    <Field 
                                        type='radio' 
                                        name='sex_id'
                                        className="input-radio"  
                                        value='2'/>
                                    <span className="input-radio__mark"></span>
                                    <span>Женский</span>
                                </label>
                            </div>
                        </div>
                        <div className="form__fieldset">
                            <Field
                                name={`email`}
                                component={Input}
                                label='E-mail'
                                type='email'
                                />
                            <Field name={'phone'}
                                component={InputMasked}
                                label={'Телефон'}
                                mask={'+7 (999) 999-99-99'}
                                type='text'
                            />
                        </div>
                        {currentUserId !== 3 &&
                            <div className="form__fieldset">
                                <Field
                                name={'company_id'}
                                component={SelectorCompanies2}
                                label='Компания'
                                />
                            </div>
                        }
                    </div>
                    <div className="form__block bordered white">
                        <h3 className="h3">Документы</h3>
                        <FieldArray name="documents" component={FieldArrayDocks}  />
                    </div>
                    
                    <div className="form__block bordered white">
                        <h3 className="h3">Мильные карты</h3>
                        <FieldArray name="miles_cards" component={FieldArrayMiles} />
                    </div>
                    <div className="form__block bordered white">
                        <h3 className="h3">Права</h3>
                        <div className="form__fieldset">
                            <Field
                                name={'active'}
                                component={StatusSelector}
                                label='Статус'
                                />
                            <div className="form__checks">
                                <label className="label-checkbox">
                                    <Field 
                                        type='checkbox' 
                                        name='access'
                                        className="label-checkbox__checkbox"  
                                        value='access'
                                        cahecked='access' />
                                    <span>Доступ в личный кабинет</span>
                                </label>
                                <label className="label-checkbox">
                                    <Field 
                                        type='checkbox' 
                                        name='travel'
                                        className="label-checkbox__checkbox"  
                                        value='travel'/>
                                    <span>Тревел-менеджер</span>
                                </label>
                                <label className="label-checkbox">
                                    <Field 
                                        type='checkbox' 
                                        name='accountant'
                                        className="label-checkbox__checkbox"  
                                        value='accountant'
                                        />
                                    <span>Бухгалтер</span>
                                </label> 
                            </div>
                        </div>
                    </div>
                    <div className="control__btns">
                        <BtnMain text={'Сохранить изменения'} eltClass={''} type="submit" disabled={updateLoading}/>
                        <BtnAds text={person?.active ? 'Деактивировать сотрудника': 'Активировать сотрудника'} icon={person?.active ? 'eye-unsee': 'eye-see' } clickAction={deactivateItem} />
                        <BtnAds text={'Удалить сотрудника'} icon={'trash-can'} clickAction={deleteItem}/>
                    </div>
                </Form>
            )}
            </Formik>

表单数组组件

export const FieldArrayDocks = (arrayHelpers: any) => (
  <>
    {arrayHelpers.form.values.documents.map((vals: any, index: number) => {      
      return (
        <>
          <div className="form__fieldset-wrapper" key={index}>            
              <div className="form__fieldset">
                  <Field
                  name={`documents[${index}].citizenship_id`}
                  component={SelectorCitizenship2}
                  />
                </div>
                <div className="form__fieldset">
                  <Field
                    name={`documents[${index}].document_type_id`}
                    component={SelectorDocuments2}
                   
                    />
                  <Field
                      name={`documents[${index}].number`}
                      component={Input}
                      label='Номер документа'
                      />
                  <Field
                    name={`documents[${index}].date`}
                    component={Datapicker2}
                    label='Дата окончания'
                    initialValues={`documents[${index}].date` || new Date().toString()}
                    />
                </div>
                <div className="form__fieldset">
                    <Field
                        name={`documents[${index}].name`}
                        component={Input}
                        label='Имя в документе'
                        initialValues={`documents[${index}].name`}
                        />
                    <Field
                        name={`documents[${index}].surname`}
                        component={Input}
                        label='Имя в фамилия'
                        />
                </div>
            </div>
            </>
          );
        })}
      <div className="form__fieldset">
        <BtnExport text={'Добавить документ'} changeAction={() => arrayHelpers.push(initialDocks)}/>
      </div>
    </>
  )

reactjs arrays forms formik
© www.soinside.com 2019 - 2024. All rights reserved.