MUI RHFSelect加载服务端选项后选中值无法通过表单必填校验问题
问题根因
报错的核心原因是你的实现完全绕开了react-hook-form(以下简称RHF)的内置状态管理逻辑:
- 你自定义的
selects本地state和RHF内部维护的表单状态是完全独立的两套数据,互不同步 - 你手动给
RHFSelect绑定的value属性和自定义onChange事件,覆盖了RHF表单组件默认的值同步逻辑,选中国家时RHF内部存储的country字段始终是空值 - 提交表单时RHF只会读取自身内部存储的字段值做规则校验,读不到合法的country值,自然就抛出
country is a required field的必填错误
修复方案
不要单独维护国家、省份的选中状态,所有表单值统一交给RHF管理,按以下步骤调整即可:
- 删除自定义的
selects相关本地state,避免多套状态冲突 - 移除
RHFSelect上手动绑定的value属性和自定义onChange事件,让组件走RHF默认的值同步逻辑 - 用RHF提供的
watch方法监听country字段变化,值变更时自动触发省份列表请求 - 切换国家时,用RHF提供的
setValue方法清空之前选中的省份值,避免残留脏数据
修正后代码示例
首先调整表单初始化和字段监听逻辑:
const methods = useForm({ resolver: yupResolver(UpdateUserSchema), // 确保默认值包含country、province字段初始值 defaultValues: { ...defaultValues, country: '', province: '' }, }); const { watch, setValue } = methods; // 监听国家选择变化 const selectedCountry = watch('country'); useEffect(() => { if (selectedCountry) { // 请求对应国家的省份列表 getProvince(selectedCountry); // 切换国家后清空已选省份 setValue('province', ''); } }, [selectedCountry, getProvince, setValue]);
调整后的选择组件代码,去掉手动绑定的受控属性:
<RHFSelect name="country" label="Country" placeholder="Country"> <option value="" /> {countries.map((option) => ( <option key={option.id} value={option.id}> {option.name} </option> ))} </RHFSelect> {/* 省份选择组件写法和国家组件一致,直接绑定name属性即可 */} <RHFSelect name="province" label="Province" placeholder="Province"> <option value="" /> {provinces.map((option) => ( <option key={option.id} value={option.id}> {option.name} </option> ))} </RHFSelect>
注意:minimal dashboard封装的
RHFSelect是基于RHF的Controller做的上层封装,手动传入value、onChange属性会直接覆盖Controller内部的表单绑定逻辑,这是RHF自定义组件最常见的踩坑点,所有表单值操作都应该走RHF官方提供的API,不要额外维护平行的本地状态。
内容的提问来源于stack exchange,提问作者Syed Mohammad Hussain Naqvi
相关产品推荐
相关产品推荐

