Formik — Как сбросить форму после подтверждения

#reactjs #forms #formik

#reactjs #формы #formik

Вопрос:

В Formik как сделать так, чтобы кнопка сброса сбрасывала форму только после подтверждения?

Приведенный ниже мой код по-прежнему сбрасывает форму, даже когда вы нажимаете «Отмена».

 var handleReset = (values, formProps) => {
    return window.confirm('Reset?'); // still resets after you Cancel :(
};

return (
  <Formik onReset={handleReset}>
    {(formProps) => { 
      return (
        <Form>
          ...
          <button type='reset'>Reset</button>
        </Form>
      )}}
  </Formik>
);
  

Ответ №1:

Привет @Aximili, который вы можете использовать resetForm в onSubmit.

 onSubmit={(values, { resetForm }) => {

      // do your stuff 
      resetForm();

}}
  

что resetForm можно сделать?

Обязательно сбросьте форму. Это устранит ошибки и коснется, установит isSubmitting в false, isValidating в false и повторно запустит mapPropsToValues с реквизитами текущего WrappedComponent или тем, что передается в качестве аргумента. Последнее полезно для вызова resetForm в componentWillReceiveProps.

Ответ №2:

Я не совсем уверен, но думаю, вам придется написать свою собственную функцию сброса без кнопки с reset типом. Что-то вроде этого:

 const handleReset = (resetForm) => {
  if (window.confirm('Reset?')) {
    resetForm();
  }
};

function Example() {
  return (
    <Formik initialValues={{ value: 1 }}>
      {formProps => {
        return (
          <Form>
            <Field name="value" type="number" />
            <button
              onClick={handleReset.bind(null, formProps.resetForm)}
              type="button"
            >
              Reset
            </button>
          </Form>
        );
      }}
    </Formik>
  );
}
  

Если вы действительно хотите использовать onReset , я думаю, единственный способ — выдать ошибку. Исходный код Formik, похоже, указывает, что resetForm() он будет вызываться независимо от того, что возвращает ваша onReset() функция.

 const handleReset = () => {
  if (!window.confirm('Reset?')) {
    throw new Error('Cancel reset');
  }
};

function Example() {
  return (
    <Formik initialValues={{ value: 1 }} onReset={handleReset}>
      {formProps => {
        return (
          <Form>
            <Field name="value" type="number" />
            <button type="reset">
              Reset
            </button>
          </Form>
        );
      }}
    </Formik>
  );
}
  

Я бы все равно выбрал первое решение, хотя лично.

Комментарии:

1. Спасибо, MadScone. Да, вы могли бы это сделать, но у Formik уже есть onReset , поэтому я подумал, что должен быть способ сделать это там

2. Я обновил свой ответ возможным решением, если вы действительно хотите использовать onReset .

3. Большое спасибо за просмотр исходного кода, который выглядит как ограничение Formik. Я остановлюсь на вашем первом решении 🙂

Ответ №3:

Я понимаю, что вопрос OP был для Formik .

Однако для всех, кто использует useFormik hook и хочет очистить форму нажатием кнопки «Сброс», вот один из способов добиться этого.

<button type="reset" onClick={ e => formik.resetForm()}> Reset</button>

Комментарии:

1. Я пришел к этой статье в поисках этого ответа. Это было именно то, что мне было нужно, потому что реагирует на перехваты.

Ответ №4:

Моя проблема заключалась в том, что я не хотел использовать window.confirm(). Я хотел использовать свой собственный модальный, поэтому я использовал

Используйте formikcontext()

Вы можете создать функциональный компонент, подобный этому

 let resetPresForm = {};// You will have to define this before useEffect

const ResettingForm = () => {
    const { resetForm } = useFormikContext();
    resetPresForm = resetForm; // Store the value of resetForm in this variable
    return null;
};
  

Теперь импортируйте этот функциональный компонент в свой

 <Formik>
     <button type="button" onClick={() => { setShowResetModal(true) }} className="comman-btn">Reset</button>
     <ResettingForm />
</Formik>
  

Теперь при подтверждении модального компонента вы можете

 const resetPrescriptionForm = () => {
    setShowResetModal(false);
    resetPresForm();
}
  

Ссылка

Ответ №5:

Вот решение:

 <Formik
initialValues={initialValues}
onSubmit={async (values, { resetForm }) => {
  await onSubmit(values)
  resetForm()
}}>
  

Немедленно сбросьте форму при отправке.

Я не использую пользовательскую оболочку вокруг Formik.

Комментарии:

1. это здорово, если вам не нужна кнопка, подобная запрошенной OP. В итоге я поступил аналогично этому, но в объявлении ‘const onSubmit’. И я хотел сохранить заполненные данные формы, поэтому просто выполнил actions.setSubmitting(false) вместо сброса всей формы.

Ответ №6:

в 2023 году formik.resetForm(); у меня это сработало.

вот полный код для onSubmit события

   onSubmit:(values)=>{
const name = values.name;
      const mobile = values.mobile;
      const website = values.website;
      const service = values.service;
      const msg = values.msg;
  
axios.post('/api/SendContactForm', {name, mobile, website, service, msg})
      .then(function (response) {
           //console.log(response);
              toast.success('👋 Thanks for the message. We will contact you asap.');
              formik.resetForm();
          })
          .catch(function (error) {
            console.log(error);
            formik.resetForm();
            toast.error(error.message || error.statusText);
          });
     
  
      }
  
  });

  

Комментарии:

1. Вы можете упростить код, добавив finally обработчик обратного вызова к обещанию, который сбрасывает форму, поэтому вам не нужно делать это дважды.

Ответ №7:

Я использовал actions.resetForm() , и Это решило проблему.

 onSubmit={(values, actions) => {

     actions.resetForm();

}}