использование формы хука реакции в родном приложении реакции

Я пытаюсь создать повторно используемый компонент контроллера, который получает реквизит 'name' вместо того, чтобы снова и снова копировать одни и те же теги контроллера с разными реквизитами 'name'.

Вместо того, чтобы писать это:

MyScreen.tsx

       <Controller
          name="name"
          control={control}
          rules={{
            required: {value: true, message: 'Name is required'},
          }}
          defaultValue=""
          render={({onChange, value}: any) => (
            <Input
              error={errors.name}
              errorText={errors?.name?.message}
              onChangeText={(text: any) => onChange(text)}
              value={value}
              placeholder="Name"
            />
          )}
        />
       <Controller
          name="email"
          control={control}
          rules={{
            required: {value: true, message: 'Email is required'},
          }}
          defaultValue=""
          render={({onChange, value}: any) => (
            <Input
              error={errors.name}
              errorText={errors?.name?.message}
              onChangeText={(text: any) => onChange(text)}
              value={value}
              placeholder="Email"
            />
          )}
        />

Я хотел бы иметь что-то вроде этого:

MyScreen.tsx

<MyControllerComponet name ="name"/>
<MyControllerComponet name ="email"/>

И экспортируйте MyControllerComponet следующим образом:

const MyControllerComponet= (props)=>{
const {handleSubmit, control, errors} = useForm();
 return (
    <View>
      <Controller
        name={props.name}
        control={control}
        rules={{
          required: {value: true, message: 'Email is required'},
          pattern: {
            value: EMAIL_REGEX,
            message: 'Not a valid email',
          },
        }}
        defaultValue=""
        render={({onChange, value}: any) => (
          <TextInput
            style={[styles.inputContainer, props.error, props.style]}
            {...props}
          />
        )}
      />
    </View>
  );
};

Этот пример не работает - ввод/данные не передаются от компонента контроллера к экрану MyScreen (от дочернего к родительскому). любые идеи, как я могу заставить его работать?

дополнительные скриншоты:

Главный экран

MyControllerComponet

окончательный результат

как вы можете видеть, только 1,2 значения (первый и второй контроллеры на главном экране) регистрируются в консоли при нажатии кнопки «Отправить», а 3-е значение — нет.

Спасибо за помощь


person menash    schedule 22.10.2020    source источник


Ответы (1)


в родительском компоненте

const from = useForm({})

затем вы можете извлечь другие значения из формы, например

const {handleSubmit} = form;

Вы можете передать форму в качестве реквизита для MyControllerComponet.

<MyControllerComponet name ="name" form={form} />

Затем внутри MyControllerComponent

const { control, errors} =props.form;
person Haseeb A    schedule 22.10.2020
comment
я не хочу обрабатыватьSubmit на MyControllerComponent, я хочу иметь кнопку в родительском компоненте и при нажатии кнопки отправки вызывать функцию handleSubmit. - person menash; 22.10.2020
comment
Да, мой плохой. Я удалю это. в этом случае в родительском компоненте просто выполните const {handleSubmit} = form; или используйте напрямую как form.handleSubmit. - person Haseeb A; 22.10.2020
comment
можете ли вы написать это более организованно, пожалуйста? вы имеете в виду в родительском компоненте сделать const {handleSubmit} = form вместо const {handleSubmit, control, errors, register, setValue, form} = useForm(); ? - person menash; 22.10.2020
comment
Я имел в виду, что вы можете сохранить экземпляр формы в родительском компоненте и передать его в качестве реквизита дочерним MyController компонентам. оттуда вы можете извлечь такие значения, как control, errors и т. д., а в родительском компоненте вы можете обрабатывать handleSubmit - person Haseeb A; 22.10.2020