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

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

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

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>
);
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
34
0
83 204
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Я не совсем уверен, но думаю, вам придется написать свою функцию сброса без кнопки с типом 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>
  );
}

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

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

Aximili 11.04.2019 01:36

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

Ciarán Tobin 11.04.2019 11:09

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

Aximili 12.04.2019 05:01

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

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

      // do your stuff 
      resetForm();

}}

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

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

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

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

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

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

CokoBWare 15.12.2020 22:15

Если вы используете useFormik хук, используйте formik.resetForm() для события onClick или если вы используете компонент <Formik>, вы можете сделать это следующим образом:

onSubmit = {(values, { setSubmitting, resetForm }) => {
    // your code
    resetForm();
}}

зачем копируете ответы.

patelarpan 29.10.2021 08:33

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

useFormikContext()

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

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();
}

Ссылка

Другие вопросы по теме