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

在自定义函数中调用Antd Form.useWatch()触发Hooks调用位置错误

问题原因

Form.useWatch 是遵循React Hook规则的API,它必须在函数组件的顶层或者自定义Hook的顶层调用,不能嵌套在普通函数(比如你的getFieldValue、checkAccountNumber)内部,否则就会触发「Hooks can only be called inside of the body of a function component」错误。

解决方案

根据你的使用场景,有几种可行的修复方式:

方式1:在组件顶层直接监听字段

如果需要实时监听account_number字段的变化,直接在组件顶层调用Form.useWatch,之后在checkAccountNumber里直接使用这个值:

// 函数组件的顶层调用Hook
const accountNumber = Form.useWatch("account_number", form);

const checkAccountNumber = () => {
  if(isNumeric(accountNumber))
    console.log("this true")
  else
    console.log("this is false");
}

方式2:封装成合法的自定义Hook

如果需要复用监听不同字段的逻辑,把getFieldValue改成符合规范的自定义Hook(必须以use开头),然后在组件顶层调用:

// 自定义Hook,名称以use开头
const useGetFieldValue = (fieldName, form) => {
  return Form.useWatch(fieldName, form);
}

// 组件顶层调用自定义Hook
const accountNumber = useGetFieldValue("account_number", form);

const checkAccountNumber = () => {
  if(isNumeric(accountNumber))
    console.log("this true")
  else
    console.log("this is false");
}

方式3:直接使用form实例的getFieldValue方法

如果只是在触发checkAccountNumber(比如按钮点击)时获取一次字段值,不需要实时监听,直接用Ant Design Form实例自带的getFieldValue方法更高效,完全不需要用useWatch:

const checkAccountNumber = () => {
  // 直接通过form实例获取字段值
  const accountNumber = form.getFieldValue("account_number");
  if(isNumeric(accountNumber))
    console.log("this true")
  else
    console.log("this is false");
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:58:18