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

React Hook Form嵌套PrimeReact表格表单提交时输入值异常

问题分析与解决方案

你遇到的核心问题是React Hook Form(RHF)没有正确追踪表格中预加载和手动输入的值,原因在于默认值未初始化、字段路径错误以及手动干预了RHF的值管理逻辑。以下是具体修复步骤:

1. 初始化表单默认值

父组件中必须将API返回的表格数据传入useForm的defaultValues,让RHF知晓这些预加载数据的存在,否则无法追踪它们:

// Parent.js
const methods = useForm({
  mode: 'onChange',
  defaultValues: {
    parent1: '',
    parent2: '',
    data: formPreload || [] // 把API返回的表格数据作为data字段的初始值
  }
})

2. 修正字段注册路径

ChildTable中register的路径格式错误,RHF中数组字段的正确路径应为data[行索引].字段名,而非你写的data.字段名[行索引]。同时要移除手动设置的value和name属性——RHF会通过register自动管理这些,手动设置会导致值追踪失效:

// ChildTable.js
const elColumns = columns.map((col) => {
  return (
    <Column
      key={col.field}
      field={col.field}
      body={(row, props) => {
        // 正确的字段路径:数组索引在前,字段名在后
        const fieldPath = `data[${props.rowIndex}].${col.name}`;
        return (
          <InputText
            {...register(fieldPath)}
            disabled={col.isReadOnly}
            type="text"
            id={`${col.name}-${props.rowIndex}`} // 给ID添加索引避免重复
          />
        )
      }}
      className={col.className}
      header={col.header}
      style={col.style}
    />
  )
})

3. 用useFieldArray的fields作为表格数据源

PrimeReact Table的数据源应该使用useFieldArray返回的fields,而非外部传入的data——因为fields是RHF管理的数组状态,能保证和表单数据同步:

// ChildTable.js
return (
  <Table
    value={fields} // 使用useFieldArray的fields作为表格数据
    // 其他表格属性...
  >
    {elColumns}
  </Table>
)

问题根源总结

  • 未设置defaultValues:RHF无法识别预加载的表格数据,提交时自然返回undefined。
  • 字段路径错误:错误的路径导致RHF找不到对应的表单字段,手动输入的值无法被正确收集。
  • 手动设置value:覆盖了RHF的自动值管理,导致输入值无法被追踪,提交时返回空字符串。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 15:50:39