You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Formik表单点击提交时提前重置,提交空表单的问题求助

Formik表单点击提交时提前重置,提交空表单的问题求助

嘿,我一眼就看出问题所在啦!你现在把resetForm直接绑定在了提交按钮的onClick事件上,这会导致一个顺序问题:点击按钮时会先执行表单重置,之后才触发表单的提交逻辑——这时候表单已经被清空了,自然提交的就是空数据咯!

解决思路

我们需要把表单重置的逻辑放在提交成功之后执行,而不是点击按钮的瞬间。Formik已经为我们提供了两种便捷的方式来实现:

方法1:利用handleFormSubmit的第二个参数onSubmitProps

Formik的onSubmit回调会自动传入onSubmitProps对象,里面包含了resetForm方法,我们可以在请求成功后调用它:

首先先把按钮上的onClick={resetForm}删掉,恢复提交按钮的默认行为:

<button type="submit"> gönder</button>

然后修改你的handleFormSubmit函数,在请求成功后添加重置逻辑:

const handleFormSubmit = async (values, onSubmitProps) => {
  const formData = new FormData();
  for (let value in values) {
    formData.append(value, values[value]);
  }
  formData.append("picturePath", values.picture.name);

  try {
    const res = await fetch(`http://localhost:5000/api/home-profile/${data[0]._id}`, {
      method: "PUT",
      body: formData,
      headers: {
        Authorization: "Bearer " + token,
      },
    });
    console.log(res.status);
    // 提交成功后才重置表单
    onSubmitProps.resetForm();
  } catch (err) {
    console.log(err);
  }
};

方法2:在Formik的render回调中处理(可选)

如果你更倾向于在组件内部控制重置时机,也可以在Formik的render回调中拿到resetForm,并在提交成功后调用。比如可以修改表单的onSubmit逻辑:

{({
  values,
  handleBlur,
  handleChange,
  handleSubmit,
  setFieldValue,
  resetForm, // 拿到resetForm方法
}) => (
  <form onSubmit={(e) => {
    handleSubmit(e).then(() => {
      // 提交成功后重置表单
      resetForm();
    });
  }}>
    <Field
      as="textarea"
      onBlur={handleBlur}
      onChange={handleChange}
      value={values.content}
      name="content"
    />
    <Dropzone
      acceptedFiles=".jpg, .jpeg, .png"
      multiple={false}
      onDrop={(acceptedFiles) =>
        setFieldValue("picture", acceptedFiles[0])
      }
    >
      {({ getRootProps, getInputProps }) => (
        <div {...getRootProps()}>
          <input {...getInputProps()} />
          {!values.picture ? (
            <p>Add Picture Here</p>
          ) : (
            values.picture.name
          )}
        </div>
      )}
    </Dropzone>
    <button type="submit"> gönder</button>
  </form>
)}

为什么原来的写法会出错?

HTML元素的事件触发是有顺序的:按钮的onClick事件会优先于表单的onSubmit事件执行。所以你点击按钮时,resetForm先把表单清空了,等handleSubmit执行时,拿到的已经是重置后的空值了。

备注:内容来源于stack exchange,提问作者M. Selim Yaman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.22 13:38:15