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

如何在类组件中使用React Hook Form?HOC方案报错求助

在类组件中使用react-hook-form的可行方案

你尝试通过HOC在类组件中集成react-hook-form但报错,核心原因是Hooks只能在React函数组件或自定义Hook的顶层调用,你的HOC外层普通函数中直接调用useForm违反了Hook使用规则。

错误原因

你的ClassHookFormWrap是普通函数而非React组件,直接在该函数内调用useForm()不符合Hook的执行规则——Hooks必须在组件渲染的顶层上下文执行,不能在普通函数、判断逻辑或循环中调用。

修复后的HOC方案

将useForm的调用移至HOC返回的函数组件内部,即可符合Hook规则:

修正后的HOC代码

import React from "react";
import { useForm } from "react-hook-form"

export const ClassHookFormWrap = (Component) => {
  // 将useForm移到返回的函数组件内部
  return (props) => {
    const form = useForm();
    console.log("form", form, Component)
    return <Component form={form} {...props}  />;
  };
};

类组件使用示例

import React from "react";
import { ClassHookFormWrap } from "./ClassHookFormWrap";

class ClassHookForm extends React.Component {
  onSubmit = (data) => {
    console.log(data);
  }
  
  render(){
    const { register, handleSubmit } = this.props.form;
    return(
      <form onSubmit={handleSubmit(this.onSubmit)}>
        <input {...register("username")} placeholder="用户名" />
        <input type="password" {...register("password")} placeholder="密码" />
        <button type="submit">提交</button>
      </form>
    )
  }
}

export default ClassHookFormWrap(ClassHookForm);

替代方案:组件容器包裹

如果不想使用HOC,也可以通过函数组件容器实现:创建一个函数组件作为容器,在其中调用useForm后将form实例传递给类组件。

// 函数容器组件
import React from "react";
import { useForm } from "react-hook-form";
import ClassHookForm from "./ClassHookForm";

export const FormContainer = (props) => {
  const form = useForm();
  return <ClassHookForm form={form} {...props} />;
};

// 类组件无需额外包裹
class ClassHookForm extends React.Component {
  onSubmit = (data) => {
    console.log(data);
  }
  
  render(){
    const { register, handleSubmit } = this.props.form;
    return(
      <form onSubmit={handleSubmit(this.onSubmit)}>
        {/* 表单元素 */}
      </form>
    )
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:15:31