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

使用NativeBase+React Hook Form时动态填充表单项未触发验证如何解决

问题根因
  • 你当前为输入框绑定的value是自行维护的formData.customer,而非React Hook Form(下简称RHF)通过Controller返回的受控value,RHF无法感知你外部自定义状态的变化,二者状态不同步
  • 选择联系人填充时仅更新了自定义的formData,没有调用RHF提供的更新方法同步字段值,自然不会触发内置的校验规则
解决步骤

1. 导出RHF的手动操作方法

从useForm的返回值中新增导出setValue,该方法可手动更新RHF管理的表单字段值,同时支持配置是否自动触发校验:

const {
  control,
  handleSubmit,
  formState: { errors },
  setValue, // 新增导出
} = useForm();

2. 统一输入框的受控源

将Input的value属性改为绑定Controller返回的value,避免双状态不同步:

// 原代码:value={formData.customer}
// 修改为:
<Input
  value={value} // 直接用Controller render参数提供的field.value
  // 其余属性保持不变
  ...
/>

如果你确实需要自行维护formData状态,保持现有的onChangeText逻辑即可,不影响正常功能。

3. 联系人选择后同步更新并触发校验

在你的联系人选择确认回调中,调用setValue更新RHF的customer字段值,开启shouldValidate配置即可自动触发校验规则:

// 假设该方法为选中联系人后的回调函数,selectedPhone为选中的手机号
const handleContactSelect = (selectedPhone) => {
  // 更新RHF字段值,开启自动校验
  setValue('customer', selectedPhone, {
    shouldValidate: true, // 更新后立即触发该字段的校验规则
    shouldDirty: true
  })
  // 同步自定义的formData(如果需要)
  setFormData(prev => ({
    ...prev,
    customer: selectedPhone
  }))
  // 关闭联系人弹窗
  setData(prev => ({
    ...prev,
    isVisibleShowContacts: false
  }))
}
可选优化

你可以完全移除自定义的formData状态,所有表单字段的状态都由RHF统一管理,需要取值时可以用getValues('customer')或者watch('customer')获取,避免双状态维护带来的同步问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 05:36:02