解决 Antd 报错Warning:Instance created by `useForm` is not connect to any Form element

Ant Design of React

antd 是基于 Ant Design 设计体系的 React UI 组件库,主要用于研发企业级中后台产品。

+

✨ 特性#

  • 🌈 提炼自企业级中后台产品的交互语言和视觉风格。

  • 📦 开箱即用的高质量 React 组件。

  • 🛡 使用 TypeScript 开发,提供完整的类型定义文件。

  • ⚙️ 全链路开发和设计工具体系。

  • 🌍 数十个国际化语言支持。

  • 🎨 深入每个细节的主题定制能力。

兼容环境#

 


问题描述

antd: 4.2.0, react: 16.13.1 Modal 中使用 Form ,使用 React Hooks const [form] = Form.useForm(); 创建实例时,会出现以下警告。

问题原因

页面初始化,调用 form 方法时,因为 Modal 还未初始化,导致 form 这时候还没有挂载的 element,这时候调用form的方法就会报错, 此时 form 没有关联任何 Form 组件。
解决方案 一:

Modal 添加属性 getContainer={false} ,使其挂载在当前 dom。
 

<Modal
    getContainer={false}
    title="修改分类"
    visible={showStatus === 2}
    onOk={handleOk}
    onCancel={() => setShowStatus(0)}
>
    <Form
        form={form}
        onFinish={onFinish}
    >
        <Item name="categoryName">
            <Input placeholder="请输入分类名称"/>
        </Item>
        <Item>
            <Button htmlType="submit">提交</Button>
        </Item>
    </Form>
</Modal>

 

解决方案二:

Modal 组件 设置 forceRender 属性

form 需要设置 form = { form }

解决方案三:

如果form确实需要延迟渲染,比如dom写在hooks里,通过函数来渲染。可以使用fields属性。

https://ant-design.antgroup.com/components/form-cn/#components-form-demo-customized-form-controls

 

表单成为受控组件。

  const [fields, setFields] = useState([
    {
      name: ['content'],
      value: '111',
    },
  ])

                <Form
                  fields={fields}
                  labelCol={{ span: 4 }}
                  wrapperCol={{ span: 17 }}
                  scrollToFirstError={true}
                  onFinish={handleFinish}
                  onFinishFailed={handleFinishFailed}
                >
                  <Form.Item
                    label="11"
                    name="content"
                    rules={[
                      {
                        required: true,
                        message: '请输入评论内容!',
                      },
                    ]}
                  >
                    <TextArea
                      showCount
                      maxLength={100}
                      rows={5}
                      ref={inputEl}
                      placeholder="友善是交流的起点"
                    />
                  </Form.Item>
                  <Form.Item
                    wrapperCol={{ offset: 0, span: 17 }}
                    className="m-modal-footer"
                  >
                    <Button
                      type="primary"
                      htmlType="submit"
                      className="m-space"
                    >
                      <Icon name="submit" className="m-tool-btn-icon"></Icon>
                      发布
                    </Button>
                  </Form.Item>
                </Form>

参考链接:

https://blog.csdn.net/qq_44721831/article/details/123230762

posted @ 2022-11-17 10:41  徐同保  阅读(23)  评论(0编辑  收藏  举报  来源