Текстовое поле React Formik Mui с пользовательским вводом, теряющим фокус

#reactjs #input #material-ui #uitextfield #focus

Вопрос:

У меня есть форма Formik, которая содержит несколько компонентов текстового поля пользовательского интерфейса Material. Все они работают нормально, за исключением одного, который теряет фокус при выполнении onChange (). Он имеет компонент PhoneInput (ввод номера телефона) в качестве пользовательского ввода. Все работает нормально (данные сохраняются и т.д.), Но я должен продолжать нажимать на ввод, чтобы продолжить запись на нем.

У меня такое чувство, что это как-то связано с рефери. При входе в inputRef (PhoneInputRef, предоставленный текстовым полем) это не похоже на обычную ссылку.

Компонент Formik (Родительский)

 {...}
<Formik
  initialValues={initialValues}
  validationSchema={validationSchema}
  onSubmit={handleClickRegister}>
  {(props) => <RegisterForm {...props} />}
</Formik>
{...}
 

Форма (Дети)

 {...}

const {
    values: {
        firstName,
        lastName,
        email,
        confirmEmail,
        password,
        confirmPassword,
        phoneNumber,
    },
//Formik methods passed as props
    errors,
    touched,
    handleChange,
    handleSubmit,
    setFieldValue,
    setFieldTouched,
} = props;

{...}

//Formik onChange handler (used by every TextField besides the one containing PhoneInput)
const change = (name, e) => {
  e.persist();
  handleChange(e);
  setFieldTouched(name, true, false);
};

//Custom onChange handler for Formik (used by PhoneInput)
const handleOnChange = (name, value) => {
  setFieldValue(name, value);
  setFieldTouched(name, true, false);
};

{...}

{/*NORMAL TEXTFIELD*/}

<TextField
  className={classes.inputField}
  id="confirmPassword"
  name="confirmPassword"
  label={t("header.registerDialog.form.labelConfirmPassword")}
  value={confirmPassword}
  onChange={change.bind(null, "confirmPassword")}
  error={touched.confirmPassword amp;amp; Boolean(errors.confirmPassword)}
  helperText={
    touched.confirmPassword amp;amp; errors.confirmPassword ? (
      errors.confirmPassword
    ) : (
      <>
        amp;nbsp;
        <br />
      </>
    )
  }
/>

{/*CUSTOM INPUT TEXTFIELD*/}

<TextField
  className={classes.textFieldPhoneInput}
  key="textFieldPhone"
  ref={textFieldRef}
  id="phoneNumber"
  name="phoneNumber"
  label={t("header.registerDialog.form.labelPhone")}
  InputLabelProps={{
    className: phoneNumber
      ? classes.inputFieldPhoneLabel
      : classes.inputFieldPhoneLabelEmpty,
  }}
    InputProps={{
      inputComponent: ({ inputRef, ...rest }) => (
        <PhoneInput
          {...rest}
          key="phoneInput"
          ref={inputRef}
          international
          countryCallingCodeEditable={false}
          name="phoneNumber"
          defaultCountry="AR"
          onChange={(phone) =>
            handleOnChange("phoneNumber", phone)
          }
          labels={phoneLanguage}
          value={phoneNumber}
        />
      ),
    }}
    error={touched.phoneNumber amp;amp; Boolean(errors.phoneNumber)}
    helperText={
      touched.phoneNumber amp;amp; errors.phoneNumber ? (
        errors.phoneNumber
      ) : (
        <>
          amp;nbsp;
          <br />
        </>
      )
    }
/>

{...}