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

ReactJS AvForm提交时动态渲染的表单字段无法获取值如何解决

问题原因

AvForm默认会基于初始化时传入的model对象确定需要收集的字段列表,且仅会收集初始化时已渲染、已注册到表单上下文的输入框值。你现在的动态字段初始化时不存在,也没有在初始model中声明,所以不会被纳入提交的values中。

修复方案

方案1:补全初始model的所有字段

在AvForm的初始model中提前声明所有可能出现的动态字段,设置默认值,让AvForm初始化时就识别到这些字段需要收集:

const initialModel = isNew 
  ? {
      applicationId: '',
      accessNumber: '', // 动态字段默认值
      // 其余所有可能出现的动态字段都在此处补全默认值
    } 
  : userClientAuthorityEntity;

// 替换原AvForm的model属性
<AvForm model={initialModel} onSubmit={saveEntity}>

方案2:改为隐藏动态字段而非销毁

如果你的业务逻辑允许,将条件渲染的销毁逻辑改为样式隐藏,保证AvInput始终存在于表单上下文中,值会被正常收集:

const RuoliChoosen = ruolo => {
  return (
    // 用display控制显隐,不销毁组件
    <div style={{ display: ruolo.ruolo ? 'block' : 'none' }}>
      <Row>
        <Col md="6">
          <AvGroup>
            <Label for="accessNumber">{'Access Number'}</Label>
            <AvInput
              id="accessNumber"
              data-cy="accessNumber"
              type="text"
              className="form-control"
              name="accessNumber"
            />
          </AvGroup>
        </Col>
        // 其余字段代码
      </Row>
    </div>
  )
}

如果需要隐藏字段时不提交对应值,可在切换前置选项的逻辑中手动将对应字段赋值为空即可。

方案3:强制刷新表单输入注册

当动态字段渲染条件变化时,手动触发AvForm重新扫描当前所有输入框,注册新增的字段:

import { useRef, useEffect } from 'react';

export const MyFunctionName = (props) => {
  const formRef = useRef(null);
  // 监听ruoli变化,强制更新表单输入注册
  useEffect(() => {
    formRef.current?.updateInputs();
  }, [ruoli]);

  // 其余原有代码...

  return (
    <AvForm ref={formRef} model={isNew ? {} : userClientAuthorityEntity} onSubmit={saveEntity}>
      {/* 其余原有表单代码 */}
    </AvForm>
  )
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:36:01