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

React Hook Form中Rules.Validate未触发问题求助

React Hook Form Controller自定义校验函数不触发的解决办法

几个常见问题及修复方式

1. 自定义校验函数返回值不符合要求

React Hook Form的validate函数必须返回布尔值或者错误字符串,如果你的wtf函数没正确返回结果,校验逻辑根本不会生效。举个例子:

  • 错误写法:
const wtf = (value) => {
  if (value.includes('xxx')) {
    console.log('不符合规则')
    // 未返回任何结果,校验等于没执行
  }
}
  • 正确写法:
const wtf = (value) => {
  if (value.includes('xxx')) {
    return '不能包含xxx字符' // 返回错误提示文本
    // 或者直接返回false:return false
  }
  return true // 校验通过必须返回true
}

2. 校验触发时机配置错误

虽然你试过切换revalidate模式,但得确保useForm的mode或者Controller的reValidateMode确实设置成了能在输入变化时触发的模式:
要么在初始化useForm时全局指定:

const { control, formState: { errors } } = useForm({
  mode: 'onChange', // 输入内容变化时立即触发校验
  // 若需要失去焦点才校验,可改用'onBlur'
})

要么给当前Controller单独设置:

<Controller
  control={control}
  name="name"
  defaultValue=""
  reValidateMode="onChange" // 单独指定该字段的校验触发时机
  rules={{
    required: true,
    minLength: 3,
    maxLength: 300,
    validate: wtf,
  }}
  // ...其他属性
/>

3. 自定义函数存在定义问题

检查wtf函数是否有拼写错误,或是作用域问题导致未被正确引用。如果担心组件重渲染影响函数引用,可以用useCallback包裹:

import { useCallback } from 'react'

// ...

const wtf = useCallback((value) => {
  // 你的校验逻辑
}, [])

4. 优化错误信息展示逻辑

你代码里helperText用了formState?.errors?.name?.message,其实fieldState.error已经包含当前字段的错误信息,统一写法更清晰(虽不会导致校验不触发,但能提升代码可读性):

render={({ field, fieldState: { error } }) => (
  <TextField
    {...field}
    fullWidth
    label="Name"
    size="small"
    helperText={error?.message} // 直接使用fieldState的error信息
    error={!!error}
  />
)}

完整可运行示例

import { useForm, Controller } from 'react-hook-form'
import TextField from '@mui/material/TextField'

const MyForm = () => {
  const { control, formState: { errors } } = useForm({
    mode: 'onChange'
  })

  const wtf = (value) => {
    if (value?.includes('test')) {
      return '输入内容不能包含"test"'
    }
    return true
  }

  return (
    <Controller
      control={control}
      name="name"
      defaultValue=""
      rules={{
        required: '这是必填项',
        minLength: { value: 3, message: '最少需要3个字符' },
        maxLength: { value: 300, message: '最多允许300个字符' },
        validate: wtf,
      }}
      render={({ field, fieldState: { error } }) => (
        <TextField
          {...field}
          fullWidth
          label="Name"
          size="small"
          helperText={error?.message}
          error={!!error}
        />
      )}
    />
  )
}

export default MyForm

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:10:18