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