Formik - 如何在确认后重置表格
Formik - How to reset form after confirmation
在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>
);
我不完全确定,但我认为您将不得不编写自己的不带 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 source code 似乎表明 resetForm()
将被调用,无论您的 onReset()
函数 returns.
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>
);
}
我个人仍然会选择第一个解决方案。
你好@Aximili 你可以在 onSubmit 中使用 resetForm
。
onSubmit={(values, { resetForm }) => {
// do your stuff
resetForm();
}}
resetForm
可以做什么?
强制重置表单。这将清除错误和触摸,将 isSubmitting 设置为 false,将 isValidating 设置为 false,并使用当前 WrappedComponent 的 props 或作为参数传递的内容重新运行 mapPropsToValues。后者对于在 componentWillReceiveProps 中调用 resetForm 很有用。
我知道 OP 的问题是针对 Formik
。
但是,对于任何使用 useFormik
挂钩并希望在单击 'reset' 按钮时清除表单的人来说,这是实现此目的的一种方法。
<button type="reset" onClick={ e => formik.resetForm()}> Reset</button>
我的问题是我不想使用 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();
}
在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>
);
我不完全确定,但我认为您将不得不编写自己的不带 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 source code 似乎表明 resetForm()
将被调用,无论您的 onReset()
函数 returns.
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>
);
}
我个人仍然会选择第一个解决方案。
你好@Aximili 你可以在 onSubmit 中使用 resetForm
。
onSubmit={(values, { resetForm }) => {
// do your stuff
resetForm();
}}
resetForm
可以做什么?
强制重置表单。这将清除错误和触摸,将 isSubmitting 设置为 false,将 isValidating 设置为 false,并使用当前 WrappedComponent 的 props 或作为参数传递的内容重新运行 mapPropsToValues。后者对于在 componentWillReceiveProps 中调用 resetForm 很有用。
我知道 OP 的问题是针对 Formik
。
但是,对于任何使用 useFormik
挂钩并希望在单击 'reset' 按钮时清除表单的人来说,这是实现此目的的一种方法。
<button type="reset" onClick={ e => formik.resetForm()}> Reset</button>
我的问题是我不想使用 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();
}