React:如何在不获取警告的情况下使用子FormItem组件警告:validateDOMNesting:<form>不能显示为<form>的后代

The*_*mad 5 forms nested-forms reactjs

鉴于父组件,我使用的是子组件DynamicFieldSet是一个分组FormItems。但是我收到错误:

Warning: validateDOMNesting(...): <form> cannot appear as a descendant of <form>. See CreateTopic > Form > form > ... > DynamicFieldSet > Form > form.

我试图删除<Form> </Form>子组件中的标签,但这是一个编译错误。

有没有一种方法可以禁用子窗体视图的呈现?

父组件

class CreateTopic extends React.Component {
render() {
    return (
      <div className="create-topic-container">
        <h3>Create an event</h3>
        <Form onSubmit={this.handleSubmit}>
          <FormItem>...</FormItem>
          <FormItem>...</FormItem>
          <FormItem>...</FormItem>
          <FormItem
            {...formItemLayout}
            label="Results"
            style={{ marginBottom: SPACING_FORM_ITEM }}
          >
            {getFieldDecorator('results', {
              rules: [
                {
                  required: true,
                  message: 'Results cannot be empty.',
                },
              ],
            })(<DynamicFieldSet
              form={this.props.form}
            />)}
          </FormItem>
        </Form>
      </div>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

DynamicFieldSet-子组件

export class DynamicFieldSet extends React.Component {
  render() {
    getFieldDecorator('keys', { initialValue: ['0', '1'] });
    const keys = getFieldValue('keys');
    const formItems = keys.map((k, index) => {
      return (
        <FormItem
          {...formItemLayoutWithOutLabel}
          required={false}
          key={k}
        >
          {getFieldDecorator(`results[${k}]`, {
            validateTrigger: ['onChange', 'onBlur'],
            rules: [
              {
                required: true,
                whitespace: true,
                message: 'Result name cannot be empty.',
              },
              {
                validator: this.validateLength,
              },
            ],
          })(<Input placeholder={`Result #${index + 1}`} style={{ width: '80%', marginRight: 8 }} />)}
          {keys.length > 2 ? (
            <Icon
              className="dynamic-delete-button"
              type="minus-circle-o"
              disabled={keys.length === 1}
              onClick={() => this.remove(k)}
            />
          ) : null}
        </FormItem>
      );
    });

    return (
      <Form>
        {formItems}
        <FormItem {...formItemLayoutWithOutLabel}>
          {keys.length < 10 ? (
            <Button type="dashed" onClick={this.add} style={{ width: '80%' }}>
              <Icon type="plus" />Add Result
            </Button>
          ) : null}
        </FormItem>
      </Form>
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

Thi*_*ker 17

我在使用时遇到了这个问题ant design table,结果发现它不是引发警告的蚂蚁设计。这是网络标准描述

"Every form must be enclosed within a FORM element. There can be several forms in a single document, but the FORM element can't be nested."

因此,表单标签内不应有表单标签。

为了解决这个问题(在我们的例子中),删除FormDynamicFieldSet “return” 中的div标签并替换为一个标签

希望能帮助到你 :)

  • Ant 设计具有“component”属性,当在嵌套表单上设置为“false”时,会删除嵌套的 Form 标签,因此会出现错误,并且它将像根本没有嵌套一样工作。 (3认同)

小智 9

您可以像这样输入表单:

import Portal from '@material-ui/core/Portal';

const FooComponent = (props) => {
   const portalRef = useRef(null);

   return <>
      <form>
        First form
        <div ref={portalRef} />
      </form>
      <Portal container={portalRef.current}>
        <form>Another form here</form>
      </Portal>
   </>;
}
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,我使用了reactmaterial-uiPortal组件。但你也可以尝试使用React Portals来实现它