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
相关产品推荐
相关产品推荐

