web-dev-qa-db-ja.com

React:警告を取得せずに子FormItemコンポーネントを使用する方法:validateDOMNesting:<form>は<form>の子孫として表示できません

親コンポーネントを指定すると、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>
    );
  }
}

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>
    );
  }
}
6
The Nomad

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."

したがって、フォームタグ内にフォームタグがあってはなりません。

この問題を解決するには(この場合)、DynamicFieldSetの「return」内のFormタグを削除し、divタグに置き換えます。

それが役に立てば幸い :)

4
Thinker

次のようなフォームをポータル化できます。

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>
   </>;
}

上記の例では、 react material-ui Portalコンポーネント を使用しています。しかし、 React Portals でも実装を試みることができます

0
BigBadAlien

これは、別の<form>タグ内で<form>を宣言したbcozで発生します。