Как добиться проверки при отправке в первый раз, а затем проверки при внесении изменений после второго использования с помощью formik - PullRequest
0 голосов
/ 14 апреля 2020

Таким образом, я сталкиваюсь с парой проблем, когда пытаюсь использовать formik для обработки моих полей ввода, в основном, после нажатия на одно из полей ввода, проверка запускается для остальных, и я не хочу, чтобы это произошло.

Предпочтительно для проверка в первый раз должна проводиться только после отправки, а затем после проверки продолжается обмен.

Вот мой код:

logi c:

const CompanyProfile = () => {
  const CompanySchema = Yup.object().shape({
    name: Yup.string()
      .min(2, 'too short')
      .required(ERROR_REQUIRED),
    industry: Yup.string().notRequired(),
    address: Yup.string().notRequired(),
    crn: Yup.number().required(ERROR_REQUIRED),
    website: Yup.string().notRequired(),
    employeesNbr: Yup.string().required(ERROR_REQUIRED),
    phoneNumber: Yup.number().required(ERROR_REQUIRED),

    userRole: Yup.string().required(ERROR_REQUIRED),
    personCheck: Yup.boolean().required(ERROR_REQUIRED),
  });

  const formik = useFormik({
    initialTouched: false,
    validateOnChange: true,
    initialValues: {
      name: '',
      industry: '',
      address: '',
      crn: '',
      website: '',
      employeesNbr: '',
      phoneNumber: '',
      userRole: '',
      personCheck: false,
    },

    validationSchema: CompanySchema,
    onSubmit: values => {
      alert(JSON.stringify(values, null, 2));
    },
  });

  return (
    <Skeleton pageTitle={PAGE_TITLE_COMPANY_PROFILE}>
      <CompanyProfileForm formik={formik} />
    </Skeleton>
  );
};
export default CompanyProfile;

front- конец

const CompanyProfileForm = ({ formik }: Props) => {
  const [modal, setModal] = useState(false);

  const { errors } = formik;

  const handleSubmit = () => {
    console.log(formik);
    formik.handleSubmit();
    if (
      !formik.errors.name &&
      !formik.errors.crn &&
      !formik.errors.employeesNbr &&
      !formik.errors.phoneNumber &&
      !formik.errors.userRole
    ) {
      setModal(true);
    } else setModal(false);
  };

  const handleModalClick = () => {
    setModal(false);
  };
  return (
    <div style={screenContainer}>
      {formik.errors.personCheck && modal && (
        <ModalPopup
          warningMessage={WARNING_CONFIRM_PERSON}
          onClick={handleModalClick}
          success={false}
        />
      )}
      <div style={inputDiv}>
        <div style={inputContainerLabel}>
          <Nunito16 style={labelStyle}>{COMPANY_DETAILS}</Nunito16>
        </div>
        <div style={inputFieldContainer}>
          <div style={firstInputColumn}>
            <div style={inputContainer}>
              <Nunito20 style={inputLabel}>{COMPANY_FORM_INPUT_NAME}</Nunito20>
              <InputValidation
                type="text"
                name="name"
                value={formik.name}
                handleInputChange={formik.handleChange}
                hasError={formik.errors.name}
                validationMessage={formik.errors.name}
              />
            </div>

            <div style={inputContainer}>
              <Nunito20 style={inputLabel}>
                {COMPANY_FORM_INPUT_INDUSTRY}
              </Nunito20>
              <InputValidation
                type="text"
                name="industry"
                value={formik.industry}
                handleInputChange={formik.handleChange}
                hasError={formik.errors.industry}
                validationMessage={ERROR_REQUIRED}
              />
            </div>

            <div style={inputContainer}>
              <Nunito20 style={inputLabel}>
                {COMPANY_FORM_INPUT_ADDRESS}
              </Nunito20>
              <InputValidation
                type="text"
                name="address"
                value={formik.address}
                handleInputChange={formik.handleChange}
                hasError={formik.errors.address}
                validationMessage={formik.errors.address}
              />
            </div>
            <div style={inputContainer}>
              <Nunito20 style={inputLabel}>
                {COMPANY_FORM_INPUT_CR_NUMBER}
              </Nunito20>
              <InputValidation
                type="number"
                name="crn"
                value={formik.crn}
                handleInputChange={formik.handleChange}
                hasError={formik.errors.crn}
                validationMessage={formik.errors.crn}
              />
            </div>
          </div>
          <div style={secondInputColumn}>
            <div style={inputContainer}>
              <Nunito20 style={inputLabel}>
                {COMPANY_FORM_INPUT_WEBSITE}
              </Nunito20>
              <InputValidation
                type="url"
                name="website"
                value={formik.website}
                handleInputChange={formik.handleChange}
                hasError={formik.errors.website}
                validationMessage={formik.errors.website}
              />
            </div>

            <div style={inputContainer}>
              <Nunito20 style={inputLabel}>
                {COMPANY_FORM_INPUT_EMPLOYEES_NBR}
              </Nunito20>
              <InputValidation
                type="number"
                name="employeesNbr"
                value={formik.employeesNbr}
                handleInputChange={formik.handleChange}
                hasError={formik.errors.employeesNbr}
                validationMessage={ERROR_REQUIRED}
              />
            </div>
            <div style={inputContainer}>
              <Nunito20 style={inputLabel}>{COMPANY_FORM_INPUT_PHONE}</Nunito20>
              <PhoneInputValidation
                name="phoneNumber"
                value={formik.phoneNumber}
                handleInputChange={formik.handleChange}
                hasError={formik.errors.phoneNumber}
                validationMessage={formik.errors.phoneNumber}
              />
            </div>

            <div style={inputContainer}>
              <Nunito20 style={inputLabel}>
                {COMPANY_FORM_INPUT_EMPLOYEE_ROLE}
              </Nunito20>
              <InputValidation
                type="text"
                name="userRole"
                value={formik.userRole}
                handleInputChange={formik.handleChange}
                hasError={formik.errors.userRole}
                validationMessage={formik.errors.userRole}
              />
            </div>
          </div>
        </div>
        <div style={tickBoxContainer}>
          <div style={checkBoxDiv}>
            <Checkbox handleChange={formik.handleChange} name="personCheck" />
            <NunitoBold18 style={checkBoxLabel}>{PERSON_CHECK}</NunitoBold18>
          </div>
        </div>
      </div>
      <SubmitButton style={submitButton} onClick={handleSubmit}>
        {CONTINUE}
      </SubmitButton>
    </div>
  );
};

1 Ответ

1 голос
/ 15 апреля 2020

Попробуйте

Используйте validateOnChange и validateOnBlur реквизиты и введите значение false.

См. Документы:

https://jaredpalmer.com/formik/docs/guides/validation#field - проверка уровня

https://jaredpalmer.com/formik/docs/api/formik#validateonblur -boolean

Любые дальнейшие проблемы, оставьте комментарий ..

...