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

React中如何在Antd Modal内使用多Form?解决表单实例未定义问题

解决Antd Modal嵌套多Form时表单实例获取undefined的问题

问题根源很明确:Form.useForm()一次调用只会生成一个表单实例,你用数组解构试图取第二个值赋值给secondForm,但这个值根本不存在,所以输出undefined。

正确的做法是给每个Form单独调用Form.useForm()来获取对应的实例:

修改后的完整代码:

const GenerateReportModal = ({ isVisible, onCLose, title, ...props }) => {
  // 每个表单单独调用useForm获取实例
  const [form1] = Form.useForm();
  const [secondForm] = Form.useForm();

  const onChangeTemplate = (selectedTemplateId) => {
    console.log(secondForm); // 现在能正确获取到表单实例了
  };

  return (
    <Modal
      forceRender
      width="75%"
      title={false}
      visible={isVisible}
      onCancel={() => {
        onCLose();
      }}
      footer={null}
      getContainer={false}
    >
      <div>
        <AntSelect
          allowClear
          placeholder="Select Template "
          style={{ width: "20%" }}
          onChange={onChangeTemplate}
        />
      </div>

      <Panel header={titleRender("Select fields")} key="1">
        <Form form={form1}>
          <Input />
        </Form>
      </Panel>

      <div>
        <div style={{ padding: "12px" }}>
          <h5>Select report type</h5>
          <Form form={secondForm}>
            <Form.Item name="reportType">
              <Select
                allowClear
                options={props.reportTypes} // Antd Select的选项属性是options,修正原代码的itemList
                onChange={(value) => console.log(value)} 
              />  
            </Form.Item>
          </Form>
        </div>
      </div>
    </Modal>
  );
};

额外提醒:

  • 原代码中Modal的visible属性写死为visible,应该绑定传入的isVisible参数,否则模态框会一直显示,示例中已修正
  • 你的Modal已经开启forceRender,这很关键,它能确保表单组件在模态框初始化时就完成渲染,避免因懒加载导致表单实例无法正常初始化

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:13:19