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

如何在Formik表单提交成功后禁用整个表单,禁止用户操作输入项

解决方案

你可以通过维护提交状态、给表单元素绑定禁用属性的方式实现需求,具体修改步骤如下:

  1. 修正提交状态的拼写错误
    你当前定义的提交状态变量拼写有误,先修正:
// 原代码
const [submitted,setSubmittde] = useState(false);
// 修改为
const [submitted, setSubmitted] = useState(false);
  1. 提交成功后更新提交状态
    在接口请求成功的回调中标记表单为已提交状态,同时建议将重置表单的逻辑移到成功回调内,避免提交失败时用户输入被清空:
fetch(request)
  .then((res) => res.json())
  .then((data) => {
    if (
      data.message ===
      'We have received your message and will get in touch shortly. Thanks!'
    ) {
      setState({
        msg: data.message,
      });
      setSubmitted(true); // 新增,标记表单已提交
      resetForm(); // 将原来在回调外的resetForm移到此处
    } else {
      console.log('error');
    }
  });
// 删除原来在fetch外的resetForm()调用
  1. 给所有表单元素和提交按钮添加禁用属性
    为所有Field组件、提交按钮绑定disabled属性,属性值为我们维护的submitted状态:
// 输入框示例
<Field
  id="outlined-multiline-flexible"
  type="text"
  name="name"
  placeholder="Name"
  component={MyInput}
  disabled={submitted} // 新增禁用属性
/>

// 提交按钮示例
<Button
  type="submit"
  variant="contained"
  onClick={() =>
    Event(
      'Contact from',
      'Client submitted ',
      'domain',
    )
  }
  disabled={submitted} // 新增禁用属性
  style={{
    background: '#F79924',
    color: 'white',
    fontFamily: 'roboto',
    fontSize: '1rem',
  }}
>
  Submit 
</Button>

所有Field组件都需要添加上述disabled={submitted}属性。

  1. 检查自定义组件属性透传
    确认你封装的MyInput和Textarea组件会将接收的disabled属性透传给内部的原生input/textarea元素,否则禁用属性不会生效。

如果需要在提交请求的过程中也防止用户重复操作,可以使用Formik内置的isSubmitting状态:
将Formik渲染回调的参数修改为{({ errors, touched, isSubmitting }) => (,然后把所有disabled属性值改为disabled={submitted || isSubmitting}即可。


内容的提问来源于stack exchange,提问作者Programmer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 23:24:00