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

使用useCallback包裹的onSubmit方法未触发问题求助

等待列表表单onSubmit回调不触发的排查与修复

核心问题与修复

1. useCallback依赖项完全错误

你的useCallback依赖数组写了[useCallback],这是无效的,会导致回调函数每次渲染都重新创建,同时因为缺少实际用到的外部变量(比如setError),可能引发闭包问题,甚至让handleSubmit无法正确绑定回调逻辑。
修复:将依赖数组替换为回调内部实际用到的外部变量,比如setError(假设setError是你组件中用于设置错误状态的函数):

const onSubmit = useCallback(
  async (data: FormData): Promise<void> => {
    // 原有逻辑保持不变
  }, [setError]); // 这里替换为实际依赖的变量

2. 表单验证未通过,提交被拦截

你配置了resolver: formValidation,如果用户输入的邮箱不符合验证规则(比如格式错误),handleSubmit会直接拦截提交,不会执行你的onSubmit回调。
排查方式:

  • 检查页面是否显示errors.email?.message的错误提示
  • 在组件中打印错误对象,确认验证状态:
    console.log('表单验证错误:', errors);
    

3. 自定义Input组件未正确绑定register

如果你的自定义Input组件没有把register返回的属性(onChange、onBlur、name等)传递给原生<input>元素,react-hook-form无法收集表单数据,验证会失败,提交被拦截。
修复示例:确保Input组件内部正确展开register返回的属性:

// 自定义Input组件内部实现
const Input = ({ name, label, register, error }) => {
  return (
    <div>
      <label>{label}</label>
      <input {...register(name)} /> {/* 关键:传递register的所有绑定属性 */}
      {error && <span className="error">{error}</span>}
    </div>
  );
};

4. 自定义Button组件未正确渲染submit类型

如果你的Button组件没有把type="submit"传递给原生<button>元素(比如默认渲染成type="button"或者非按钮元素),点击后不会触发表单的submit事件。
修复示例:确保Button组件正确传递type属性:

// 自定义Button组件内部实现
const Button = ({ type, label, appearance }) => {
  return (
    <button type={type} className={`btn-${appearance}`}>
      {label}
    </button>
  );
};

额外调试技巧

  • 给表单的submit事件加日志,确认事件是否触发:
    <form 
      onSubmit={(e) => {
        console.log('表单submit事件已触发');
        handleSubmit(onSubmit)(e);
      }} 
      className="form"
    >
    
  • 暂时移除resolver: formValidation,测试基础提交逻辑是否正常,排除验证规则的干扰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:05:34