我遇到了SO溢出问题,这表明我们可以在提交表单后在表单上使用e.target.reset()
来重置表单。但是,我无法在我的情况下使用它:
export default function RemoveUserPage() {
const [isSubmitted, setIsSubmitted] = useState(false);
const [isRemoved, setIsRemoved] = useState(false);
const [errorMessage, setErrorMessage] = useState('');
const [removeUser] = useMutation<DeleteUserReponse>(REMOVE_USER);
let submitForm = (email: string) => {
setIsSubmitted(true);
removeUser({
variables: {
email: email,
},
})
.then(({ data }: ExecutionResult<DeleteUserReponse>) => {
setIsRemoved(true);
}})
};
const initialSTATE={ email: '' }
return (
<div>
<Formik
//initialValues={{ email: '' }}
initialValues={{ ...initialSTATE}}
onSubmit={(values, actions) => {
setTimeout(() => {
alert(JSON.stringify(values, null, 2));
actions.setSubmitting(false);
}, 1000);
}}
validationSchema={schema}>
{props => {
const {
values: { email },
errors,
touched,
handleChange,
isValid,
setFieldTouched,
} = props;
const change = (name: string, e: FormEvent) => {
e.persist();
handleChange(e);
setFieldTouched(name, true, false);
};
return (
<div className="main-content">
<form
style={{ width: '100%' }}
onSubmit={e => {
e.preventDefault();
submitForm(email);
e.target.reset();
}}>
<div>
<TextField
variant="outlined"
margin="normal"
id="email"
name="email"
helperText={touched.email ? errors.email : ''}
error={touched.email && Boolean(errors.email)}
label="Email"
value={email}
onChange={change.bind(null, 'email')}
/>
<br></br>
<CustomButton
disabled={!isValid || !email}
text={'Remove User'}
/>
</div>
</form>
<br></br>
{isSubmitted && StatusMessage(isRemoved, errorMessage)}
</div>
);
}}
</Formik>
</div>
);
}
如果我在onSubmit
末尾使用它,则会收到上述错误。我该如何解决?
答案 0 :(得分:0)
我遇到了SO溢出问题,这表明我们可以在提交表单后在表单上使用
e.target.reset()
来重置表单。
在反应时代之前可能有效。如今,响应会根据道具更改来更新真实的DOM。
是否要重置表格?使用新值渲染它!
基于docs,您应将handleSubmit
属性传递给渲染的<form/>
:
<form onSubmit={props.handleSubmit}>
此handleSubmit
将在验证后调用Formik的onSubmit
处理程序。 在这里您应该定义自定义逻辑。
onSubmit
与(values, actions)
一起调用,因此您可以
submitForm(values.email);
actions.resetForm()
或将actions
传递到您的submitForm
并在此方法中使用resetForm
。