coverPiccoverPic

AntD 报错:Warning: Instance created by `useForm` is not connected to any Form element.

前言

在使用 AntD 的Form组件时,使用 hook 操作数据。

js
  1. export function () {
  2. const [form] = Form.useForm()
  3. // ...
  4. return (
  5. <Form form={form}>
  6. //...
  7. </Form>
  8. )
  9. }

如上所示,form已经绑定到了组件Form,但是还是出现如下报错:

  1. Warning: Instance created by `useForm` is not connected to any Form element. Forget to pass `form` prop?

form没有绑定到组件Form上面去。

原因

这个Form是在Modal组件里面的,在调用useForm时,Modal内部的组件并未渲染,进行form.setFieldsValue之类的操作的时候,就提示没有绑定到Form上了。

解决

不太严谨地说,其实这种情况下报错事实上是不影响我们页面功能的正常使用的。

如果需要消除这个报错的话,可以强制Modal组件渲染或者监听组件,当组件渲染了之后再进行表单相关操作。

强制渲染

根据 AntD 的文档:

为何在 Modal 中调用 form 控制台会报错?#
Warning: Instance created by useForm is not connect to any Form element. Forget to pass form prop?

这是因为你在调用 form 方法时,Modal 还未初始化导致 form 没有关联任何 Form 组件。你可以通过给 Modal 设置 forceRender 将其预渲染。

我们可以给Modal加上forceRender属性预渲染组件。

js
  1. import { Form, Input, Modal } from 'antd'
  2. import React from 'react'
  3. import { useEffect } from 'react'
  4. export default function EditModal (props) {
  5. const {
  6. open = false,
  7. } = props
  8. const [form] = Form.useForm()
  9. // ...
  10. useEffect(() => {
  11. form.setFieldsValue({ /* ... */ })
  12. }, [form, open])
  13. // ...
  14. return (
  15. <Modal open={open} forceRender>
  16. <Form form={form} style={{ marginTop: 36 }}>
  17. <Form.Item rules={[{ required: true, message: '新标签名不能为空' }]} name='newName' label='新标签名'>
  18. <Input placeholder='请输入新标签名' allowClear/>
  19. </Form.Item>
  20. </Form>
  21. </Modal>
  22. )
  23. }

监听组件渲染

通过设置ref的方法来判断表单是否已经渲染了。

js
  1. import { Form, Input, Modal } from 'antd'
  2. import React from 'react'
  3. import { useRef } from 'react'
  4. import { useEffect } from 'react'
  5. export default function EditModal (props) {
  6. const {
  7. open = false,
  8. } = props
  9. const [form] = Form.useForm()
  10. // ...
  11. const formRef = useRef(null)
  12. useEffect(() => {
  13. if (formRef.current) {
  14. form.setFieldsValue({ /* ... */ })
  15. }
  16. }, [form, open])
  17. // ...
  18. return (
  19. <Modal open={open}>
  20. <Form ref={formRef} form={form} style={{ marginTop: 36 }}>
  21. <Form.Item rules={[{ required: true, message: '新标签名不能为空' }]} name='newName' label='新标签名'>
  22. <Input placeholder='请输入新标签名' allowClear/>
  23. </Form.Item>
  24. </Form>
  25. </Modal>
  26. )
  27. }
0 条评论未登录用户
Ctrl or + Enter 评论
© 2023-2025 LittleRangiferTarandus, All rights reserved.
🌸 Run