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

react-hook-form中resolver触发问题:状态变更后未调用的解决办法

解决useState变更后React Hook Form Resolver未触发的问题

问题核心

你的代码中getValidationSchema()仅在组件初始化时执行一次,生成的验证Schema依赖的someData是当时的快照值。后续someData更新时,Resolver不会自动重新生成,导致验证逻辑未同步更新。


方案1:让Resolver随状态自动更新

通过useEffect配合useForm提供的setResolver方法,在someData变化时动态更新Resolver,确保验证逻辑始终基于最新状态:

const [someData, setSomeData] = useState();
// ...其他状态定义

const getValidationSchema = () => yup.lazy((values) => yup.object().shape({ 
  // 这里编写依赖values和someData的动态验证规则
}));

const { setValue, formState: { isValid }, setResolver } = useForm({
  mode: 'onChange',
  defaultValues,
  resolver: yupResolver(getValidationSchema()), // 初始化Resolver
});

// 监听someData变化,更新Resolver
useEffect(() => {
  const newValidationSchema = getValidationSchema();
  setResolver(yupResolver(newValidationSchema));
}, [someData, setResolver]);

每次someData变更时,都会生成新的验证Schema并替换旧的Resolver,React Hook Form会自动触发新一轮验证。


方案2:手动触发验证

如果你的验证Schema已经通过yup.lazy实现了动态读取最新someData(lazy的回调每次验证都会执行,能拿到最新的someData),只是需要在someData变化时强制触发验证,可直接调用useForm返回的trigger方法:

const [someData, setSomeData] = useState();
// ...其他状态定义

const getValidationSchema = () => yup.lazy((values) => yup.object().shape({ 
  // 这里编写依赖values和someData的动态验证规则
}));

const { setValue, formState: { isValid }, trigger } = useForm({
  mode: 'onChange',
  resolver: yupResolver(getValidationSchema()),
  defaultValues,
});

// someData变化时手动触发验证
useEffect(() => {
  trigger(); // 触发所有字段验证
  // 若只需验证特定字段,传入字段名即可:trigger('targetField')
}, [someData, trigger]);

这种方式无需更新Resolver,仅强制重新执行一次现有验证逻辑,适合不需要修改Schema结构、仅需基于最新状态重新验证的场景。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 06:36:35