如何使用antd react组件库在模态对话中提交表单组件

vla*_*irp 9 reactjs antd

在我的组件的render方法中,我将作为父级的antd Modal组件和作为子级的antd Form组件:

    render() {
        const myForm = Form.create()(AddNewItemForm);
        ...
        return (
            ...
            <Modal
                title="Create new item"
                visible={this.state.visible}
                onOk={this.handleOk}
                onCancel={this.handleCancel}
                wrapClassName="vertical-center-modal"
                okText="Save new item"
                width="600"
            >
                <myForm />
            </Modal>
...
Run Code Online (Sandbox Code Playgroud)

如何通过单击"模态保存"按钮提交表单?

sen*_*sor 28

有一个看起来更干净的新解决方案:

<Form id="myForm">
Run Code Online (Sandbox Code Playgroud)

...

<Modal
    ...
    footer={[
        <Button form="myForm" key="submit" htmlType="submit">
            Submit
        </Button>
        ]}
>
    <CustomForm />
</Modal>
Run Code Online (Sandbox Code Playgroud)

这是因为 Button 的form属性。浏览器支持

原方案作者:https : //github.com/ant-design/ant-design/issues/9380


Chh*_*eng 24

我的解决方案是使用钩子

import { Button,  Modal, Form } from 'antd';

export default function ModalWithFormExample() {
  const [visible, setVisible] = useState(false);
  const [form] = Form.useForm();
  
  const showModal = () => {
    setVisible(true)
  }

  const handleSubmit = (values) => {
    console.log(values)
  }
  
  const handleCancel = () => {
    setVisible(false)
    form.resetFields()
  };
  
  return (
    <>
      <Button onClick={showModal}>Open Modal</Button>
      <Modal visible={visible} onOk={form.submit} onCancel={handleCancel}>
        <Form form={form} onFinish={handleSubmit}>
          {/* Any input */}
        </Form>
      </Modal>
    </>
  )
}
Run Code Online (Sandbox Code Playgroud)


小智 6

你可以研究官方例子:https : //ant.design/components/form/#components-form-demo-form-in-modal

  • 始终欢迎提供指向潜在解决方案的链接,但请[在链接周围添加上下文](http://meta.stackoverflow.com/a/8259/169503),以便您的其他用户了解它是什么以及为什么会这样那里。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。考虑到 * 仅仅只是指向外部站点的链接 * 是 [为什么以及如何删除某些答案?](http://stackoverflow.com/help/deleted-answers) 的一个可能原因。 (4认同)

vla*_*irp 5

我的解决方案是将模式对话和表单组件包装在一个新的包装器父组件中,我在其中验证handleCreate方法中的子表单组件.我使用了ref属性来引用FormOnModalWrapper组件中的myForm子组件.我通过包装父组件的道具传递父处理程序到myForm组件实例.

class FormOnModalWrapper extends React.Component {
...
    constructor(props) {
        this.state =
        {
            visible: false
            ....
        }

...
    showModal = () => {
        this.setState({
            visible: true,
        });
    }

    handleCreate = () => {
        const form = this.form;
        form.validateFields((err, values) => {
            if (err) {
                return;
            }
            console.log('Received values of form: ', values);
            form.resetFields();
            this.setState({ visible: false });
        });
    }

    saveFormRef = (form) => {
        this.form = form;
    }

render() {
...
    const myForm= Form.create()(CrateNewItemFormOnModal);
...
    return (
      <div>
            <Button onClick={this.showModal}>Add</Button>
            <myForm
                visible={this.state.visible}
                onCancel={this.handleCancel}
                onCreate={this.handleCreate}
                ref={this.saveFormRef}
            />
      </div>
     );
}
Run Code Online (Sandbox Code Playgroud)

在CrateNewItemFormOnModal组件类中,我有一个模态对话组件作为父组件和表单组件作为子组件:

export default class AddNewItemForm extends React.Component {

render() {
    ...
    const { visible, onCancel, onCreate, form } = this.props;
    ...
    return (
        <Modal
           title="Create new item"
           visible={visible}
           onOk={onCreate}
           onCancel={onCancel}
           okText="Create"
        >
          <Form>
            ...
          </Form>
        </Modal>
    );
}
Run Code Online (Sandbox Code Playgroud)