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

React Hook Form向子组件传handleSubmit后提交失效的解决方法

解决React Hook Form跨组件表单提交不触发的问题

问题原因

你当前的写法中,handleSubmit是在父组件上下文里生成的,但表单<form>位于子组件中,两者的表单上下文不匹配,导致提交时无法正确触发onSubmit回调。

解决方案1:传递完整表单实例

将useForm返回的完整表单实例传给子组件,保证子组件使用的表单上下文和父组件一致:

function Parent() {
  const form = useForm();
  const { handleSubmit } = form;

  const onSubmit = (data) => {
    console.log(data);
  };

  return <Child form={form} submit={handleSubmit(onSubmit)} />
}

function Child({ form, submit }) {
  const { register } = form;
  
  return (
    <form onSubmit={submit}>
      <input defaultValue="test" {...register("example")} />
      <input type="submit" />
    </form>
  );
}

解决方案2:使用FormProvider(官方推荐)

借助React Hook Form的FormProvider和useFormContext实现跨组件的表单状态共享,这是更规范的跨组件表单处理方式:

import { FormProvider, useForm, useFormContext } from "react-hook-form";

function Parent() {
  const formMethods = useForm();
  const { handleSubmit } = formMethods;

  const onSubmit = (data) => {
    console.log(data);
  };

  return (
    <FormProvider {...formMethods}>
      <Child submit={handleSubmit(onSubmit)} />
    </FormProvider>
  );
}

function Child({ submit }) {
  const { register } = useFormContext();
  
  return (
    <form onSubmit={submit}>
      <input defaultValue="test" {...register("example")} />
      <input type="submit" />
    </form>
  );
}

补充说明

handleSubmit内部会关联当前上下文的表单DOM节点和状态,当你在父组件生成该函数时,它并没有绑定到子组件的<form>元素上,所以点击提交无法触发回调。而把<form>放在父组件时,两者处于同一上下文,因此能正常工作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 14:02:34